1.各种内部类的介绍
http://android.blog.51cto.com/268543/384844/
下面这个文章有一些吸引人的地方:
http://blog.csdn.net/wuliming_sc/article/details/1753164
1.1内部类好处
使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
1.2内部类在独立被继承时,要注意外部类对象.super();(为什么调用的内部类的构造函数?)
1.3静态内部类的加载机制(单例模式);(为什么安全呢?)
//ret:Outer P
说明,在没有用到instance时,instance还是会加载,并没有做到延迟加载
也就是说这个Inner类不能放别的数据。只有第一用Inner类时,才可以做到“延迟加载”。
public static void main(String[] args){ Outer.getInstanceOr(); }
class Outer{ private Outer(){ System.out.println("Outer P"); } public static void getInstanceOr(){ Inner.p++; } public static Outer getInstance(){ return Inner.instance; } static class Inner{ static Outer instance = new Outer(); static int p=9; } }
1.4为什么非静态内部类不能声明静态变量??
1)
因为内部类特殊,他被定向为是和成员变量,方法一样的外部类成员
他必须跟外部类实例相关联才能初始化,这是他的特点之一,为了这个其他东西都要让路
而静态成员是不需要实例就初始化的
如果一个非静态内部类有了静态成员,静态成员不依托于任何内部类实例,那结果也就是此内部类不需要外部类实例就初始化了变量,严重侵害了内部类的定向
2)
java中规定,只有在静态或顶级类型中才可以声明静态字段,主要是为了使别的类的方法能够访问到这个变量。内部类定义在一个类内部,所以不能声明!
2.内部类的编译方式
http://android.blog.51cto.com/268543/384809
3.在单例模式下有用到静态内部类,要了解它的加载机制。
4.另外我在实验单例模式时,发现,静态内部类中,定义的非静态成员变量
class Outer{ private Outer(){} public static Outer getInstance(){ int j = new Inner().i; int l = new Inner().i+1; int k = new Inner().i = l; int l2 = new Inner().i; System.out.println(j); System.out.println(l); System.out.println(k); System.out.println(l2); return Inner.instance; } static class Inner{ static Outer instance = new Outer(); public int i=5;//不能用? } } /* 5 6 6 5 */