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
*/