天天看点

thinking in java 笔记--内部类的规则inner class rules(2007.10.12)

java的内部类有一些默认的规则 

1.  非static的内部类是不能有static成员(field)和方法的.这可能是因为非static的内部类必须要拥有其宿主类的reference有关,如果内部类有一个static的成员,那么就不用创建宿主的对象就可以访问非static内部类的成员,这样的话就与必须拥有宿主类的对象冲突了.

2.   static的内部类是不能用到非static的成员和方法的.这点和正常类相同

3.    static的内部类,如果你不去触发它的时候,它是不会进行初始化的.这里要和static变量的初始化区分好.

4.    如果引用宿主类的指针(reference),必须明确调用OuterClass.this,在内部类中用this指的是内部类当前的对象,要与宿主类的OuterCalss.this区分好,特别是两个类中有相同名称的变量时(但这种情况我们怎么会做呢)

5.    必须用宿主类的对象来创建内部类的对象,也就是内部类(非static)里面必须有一个指针是指向它的宿主类的

OuterClass outer  =  new OuterClass();   

OuterClass.InnerClass inner  =  outer.new InnerClass();

.new 指明了正确的作用域,所以不用在调用外部类的构造函数再去限定内部类的名字,像这样outer.new OuterClass.InnerClass.

6.内部类用this时要小心,实际上内部类用到的还是它自己.就是说每个成员与方法前的指针都是它自己--this,这样如果在内部类中有一个成员或方法与宿主类的成员或方法名称是一样的,那么在内部类中去调用这个成员或方法实际上相当于是调用 this.name, 或this.getName().如果类没有继承任何类,那么类中的super与this 指向的是同一个地方.

7.    内部类的继承必须要传递所继承的类的宿主的对象,而且要在构造方法中调用 enclosingClassReference.super()

8.    宿主类的reference是被内部类引用 的,所以只有当全部的内部类没有被引用的时候,宿主类才会被回收.

9.    放到方法内部的类称为本地内部类(local inner class),所用到的参数必须是final的.

10.  如果方法里的匿名类没有直接使用传进来的参数,而是把这个参数传给了它实现的类,例如内部类只是把参数通过构造方法传递给了父类,那么这个参数可以不做成final的

11.  方法里的内部类的修饰符只能有abstract和final

12,  利用本地内部类来替换匿名内部类的唯一正当理由是你需要一个有名字的构造方法,因为匿名内部类只能进行实例初始化  { ...........},本地内部类的名字在方法外是不能用的