一、.非静态内部类
静态内部类和非静态内部类最大的区别是:非静态内部类编译后隐式保存着外部类的引用(就算外部类对象没用了也GC不掉),但是静态内部类没有。
- 内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据
- 内部类可以对同一个包的其他类隐藏
非静态内部类创建实例,要通过外部类的实例创建:静态内部类创建实例通过外部类类本身
非静态内部类:
OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部类实例.new
静态内部类:
AAA.StaticInner in = new AAA.StaticInner();//注意是外部类本身
二、静态内部类
如果用static来修饰一个内部类,那么就是静态内部类。这个内部类属于外部类本身,但是不属于外部类的任何实例对象。
- 静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
- 外部类可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象访问其实例成员
定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。
通常称为嵌套类,当内部类是static时,意味着:
[1]要创建嵌套类的对象,并不需要其外围类的对象;
[2]不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);