public class InnerClassDemo {
static class A{}  
class B{}
public static void main(String[] args){
class C{}
//A
InnerClassDemo.A a=new InnerClassDemo.A();
//B
InnerClassDemo.B b=new InnerClassDemo().new B();
//C
C c=new C();
//D
Runnable d=new Runnable(){
public void run(){ 
}
};
}
class C{};
}
class C{};上面虽然只十几行代码,却包含了7各类的定义,而且基本包括了所有匿名类的情况。
可以看到其中有三个类名字为C,匿名类是没有名字的。

解决方案 »

  1.   

    这七个类分别为
    InnerClassDemo.class
    InnerClassDemo$A.class
    InnerClassDemo$B.class
    InnerClassDemo$1$C.class
    InnerClassDemo$1.class
    InnerClassDemo$C.class
    C.class其中第一个和最后一个为一般类,其他五个为内部类,可以分为4类。
    第一种为静态内部类,这是最为特殊的一种,具有一般类的特性,使用起来基本上没有多大的区别,例如:
    Point2D float=new Point2D.Float();
    Point2D double=new Point2D.Double();
    不过多了类限制符号,我们知道 Float和Double是Point2D的两个静态内部类,而且是public的。
    其它使用就没有区别了。
    这种类的优点是可以很容易隐藏,如果修师符号为private,就完全隐藏了,可以认为就是一个内部自定义类型。
      

  2.   

    其他三种都是非静态的,我们仍然详细划份他们的不同。第二种 我们叫一般内部类
    一般内部类具有对外部类的一个引用,所有必须有外部类的实例来创建,这是一个很怪异的语法。
    InnerClassDemo.B b=new InnerClassDemo().new B();我们可以这样理解:
    内部类相定义为
    class InnerClassDemo$B{
        InnerClassDemo$B outer;
        InnerClassDemo$B(InnerClassDemo outer){
             this.outer=outer;
        }
    }
    上面的:InnerClassDemo.B b=new InnerClassDemo().new B();
    我们改为:
    InnerClassDemo outer=new InnerClassDemo();
    InnerClassDemo$B inner=new InnerClassDemo$B(outer);
    似乎是一样的意思。
    我们可以把内部类代码转换为非内部类代码,不过内部类一个重要的优点就是简化代码。
      

  3.   

    第三种用得比较多的是匿名类
    特别是在swing中用的比较多
    启动一个线程
    new Thread(){
       public void run(){
          //doing something
       }
    }.start();
    排序
    Collections.sort(list,new Comparator(){
          public int compare(Object o1,Object o2){ return 0;}
      });这种类都是使用一次就不再使用的情况。
      

  4.   

    第四种为临时内部类,就是在方法体内定义,和局部变量一样
    把上面的匿名类变为临时类
    class MyThread extends Thread{
       public void run(){
          //doing something
       }
    }
    new MyThread().start();class MyComparator implements Comparator{
          public int compare(Object o1,Object o2){ return 0;}
    }
    Collections.sort(list,new MyComparator());
    Collections.sort(list2,new MyComparator());//在方法体内可以重复使用
      

  5.   

    内部类使用注意事项:
    这里不考虑静态内部类,因为没有什么特别的限制
    1.内部类不允许静态修饰(包括静态域,方法,静态初始化)
    2.内部类可以直接访问外围类的方法。
    3.内部类可以直接访问外围类的成员变量,语法为:OuterClass.this.FIELDNAME。
    4.如果要访问方法的参数,必须为final,主要针对匿名类和临时内部类而已,因为他们定义
      在方法体内。这里把方法体的临时变量作为一个延生,也是必须为fianl的。我像这样做是为了
      规范内部类的行为。