什么是内部类:
- 将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
成员内部类
- 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
- 当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。
- 成员内部类可以看成是外部类的一个成员,在成员内部类中无法声明静态成员,但static final(两个一起使用)字段是个例外。
- 我们知道加载类时,会先初始化静态成员,如果成员内部类有静态成员,那么内部类就会在外部类之前生成,而内部类是为外部类服务的,内部类在外部类之前就生成可能会脱离掌控。
- 在实例化成员内部类时,成员内部类会持有一个外部类当前对象的引用,这样在成员内部类中就可以直接访问外部类的成员,即使是private修饰的。
- 编译后Outer.Inner被重命名为Outer$Inner。
public class Outer {
private String outerName="outer";
private static String str1="我是静态的";
private final String str2="我是final的";
/**
* 外部类无法直接访问内部类的成员,需要实例华内部类对象
*/
private Inner inner = new Inner();
public void show(){
System.out.print(inner.innerName+"\n");
inner.show();
}
/**
* 内部类
*/
class Inner{
private String innerName="inner";
// TODO 这个是个特殊
private static final String s="";
public void show(){
// 可以直接访问外部类的成员
System.out.print(outerName+"\n");
System.out.print(str1+"\n");
System.out.print(str2+"\n");
}
}
public static void main(String[] args){
Outer outer = new Outer();
outer.show();
// 实例化内部类
Outer.Inner inner2 = outer.new Inner();
inner2.show();
}
}
局部内部类
- 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
匿名内部类
- 匿名内部类就是没有名字的内部类
- 匿名内部类不能有构造器,匿名内部类没有类名,肯定无法声明构造器。
- 匿名内部类必须继承或实现一个接口,指定给new的类型为匿名类的超类型,匿名类不能有显示的extends或implements子句,也不能有任何修饰符。
- 匿名内部类和成员内部类、局部内部类一样,也不能声明静态成员。
静态内部类
- 静态内部类,有的书上也称为嵌套类,声明它时需要用static修饰符,静态内部类不同于前三种内部类,静态内部类不会持有外部类当前对象的引用,所以在静态内部类中无法访问外部类的非静态成员,可以这么说,静态内部类不依赖于外部类。
- 指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有相同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型)一个 静态内部类去掉static 就是成员内部类,他可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法。