java - 内部类
2017-08-07 本文已影响14人
司鑫
一 定义
内部类就是将一个类的定义放在另一个类的定义内部。
二 特性
内部类最大的一个优点就是每个内部类都能独立的继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
- 内部类可以用多个实例,每个实例都有自己的信息状态,并且与外围对象的信息相互独立
- 在单个外围中,可以让多个内部类以不同的方式实现接口或继承不同的类(实现多继承)
- 内部类并没有要迷人的 “is-a” 关系,它就是一个独立的实体
- 内部类的创建不需要依赖外部类的创建
- 内部类提供了更好的封装,除了外围类其它类都不可以进行访问
三 内部类的创建
外围类中的内部类可以无限的访问外围类的属性和方法,内部类只有在编译期中存在,当编译成功后,那么内部类便会和外围类分离,生成两个类OutterClass.class
和 OuterClass$InnerClass.class
public class OuterClass {
private String name ;
private int age;
/**省略getter和setter方法**/
public class InnerClass{
public InnerClass(){
name = "小毛毛";
age = 20;
}
public void display(){
System.out.println("name:" + getName() +" ;age:" + getAge());
}
}
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass(); //创建一个内部类
innerClass.display();
}
}
四 内部类的种类
-
成员内部类
成员内部类是最简单的内部类,它相当于是外围类的一个成员,可以随意的访问外围了的任何属性和方法(包括 private 修饰的),但如果外围类要访问内部类的话,就需要使用内部类的实例来访问。
在成员内部类中需要注意:- 成员内部类中不可以有 static 修饰的属性和方法
- 创建内部类前需要先创建外部类
-
局部内部类
局部内部类存在与外围类的方法或作用域中,它只能在该方法或作用域中被使用,出了该范围便不能被访问。
public class Parcel5 {
public Destionation destionation(String str){
class PDestionation implements Destionation{
private String label;
private PDestionation(String whereTo){
label = whereTo;
}
public String readLabel(){
return label;
}
}
return new PDestionation(str);
}
public static void main(String[] args) {
Parcel5 parcel5 = new Parcel5();
Destionation d = parcel5.destionation("小毛毛");
}
}
-
静态内部类
一个被 static 修饰的内部类被称为是静态内部类,也被称为是嵌套内部类。被 static 修饰也就是意味着:- 静态内部类的创建并不依赖与外围类的创建
- 它不能访问外围类的任何非 static 修饰的变量或方法
-
匿名内部类
匿名内部类也就是没有名字的内部类,在 swing 编程中我们使用的比较多。
public class OuterClass {
public InnerClass getInnerClass(final int num,String str2){
return new InnerClass(){
int number = num + 1;
public int getNumber(){
return number;
}
};
}
public static void main(String[] args) {
OuterClass out = new OuterClass();
InnerClass inner = out.getInnerClass(2, "小毛毛");
System.out.println(inner.getNumber());
}
}
interface InnerClass {
int getNumber();
}
对于匿名内部类来说
- 不需要任何修饰符
- 如果在匿名内部类中使用了非该类中的属性或方法,那么被使用的属性或方法就必须要被设置为 final
- 匿名内部类不存在构造方法