内部类对于初学java的人来说,就是有点不好把握,所以我想再做个小总结。
内部类分为: 成员内部类、方法内部类、匿名内部类。
一:成员内部类:
class Outer {
class Inner{}
}
内部类在成员变量的位置上,才可以被修饰符所修饰,这就涉及到一些权限的问题,比如static,或者
private等等。这里要注意两点:1只有成员内部类中才能定义静态成员,因为此时内部类必须是静态的。2外部
类中的静态方法也是只能访问成员内部类,因为此时的静态类也必须是静态的。成员内部类被static修饰后,就
相当于一个静态成员,可以由类名调用。
二:方法内部类:
把类放在方法内
class Outer {
int a =10;
public void doSomething(){
int b=10;
class Inner{ public void seeOuter(){} }
Inner in = new Inner();
in.seeOuter();
} }
内部类定义在局部变量的位置上时,是不能被修饰符所修饰的。这里也要注意两点:1方法内部类只能
在定义该内部类的方法内实例化,不可以在此方法外对其实例化。2方法内部类对象不能使用该内部类所在方法
的非final局部变量。此时,内部类是可以直接访问外部类中成员a的,因为还持有外部类的引用this,但是不能
访问所在方法的非final局部变量b,因为它们的生命周期不同。
当外部类要访问内部类时,必须建立内部类对象,方法在上一篇博客中有讲到。另外,main函数是不能
放到内部类中的。
接下来,详细的说明一下注意事项的原因:
只有静态成员内部类,才可能有静态成员和被静态函数所访问。方法内部类这些特征是不具有的,这一
切都是内部类所在的位置决定的。方法内部的内部类是局部变量,局部变量的特点就是不能被static,public,
protected,private所修饰,不存在后续使用权限的问题。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部
变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用
被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样
长,所以内部类对象不能使用它们。
09-05
09-05