曾在一份代码里,看到类中类,甚是困惑。写了如下demo代码,希望剖析一二。class AlertDialog {
AlertDialog() {
System.out.println("AlertDialog constructor enter");

this.AAA();

System.out.println("AlertDialog constructor exit");
}

void AAA() {
System.out.println("AlertDialog AAA enter");

System.out.println("AlertDialog AAA exit");
}

static class Builder {
        Builder() {
         System.out.println("Builder constructor enter");
        
         this.BBB();
        
         System.out.println("Builder constructor exit");
        }
        
        void BBB() {
     System.out.println("Builder BBB enter");
    
     System.out.println("Builder BBB exit");
     }
}
}public class Demo_s {
    public static void main(String args[]) {
     System.out.println("main enter");
    
     new AlertDialog();
     new AlertDialog.Builder();
    
     System.out.println("main exit");
    }
}

解决方案 »

  1.   

    class AlertDialog {
        AlertDialog() { //构造函数
            System.out.println("AlertDialog constructor enter");
            
            this.AAA(); //调用方法
            
            System.out.println("AlertDialog constructor exit");
        }
        
        void AAA() {
            System.out.println("AlertDialog AAA enter");
            
            System.out.println("AlertDialog AAA exit");
        }
        
        static class Builder { //静态内部类,可以直接通过 new 外部类.内部类 的方式生成内部类实例
            Builder() { //构造函数
                System.out.println("Builder constructor enter");
                
                this.BBB(); //调用方法
                
                System.out.println("Builder constructor exit");
            }
            
            void BBB() {
                System.out.println("Builder BBB enter");
                
                System.out.println("Builder BBB exit");
            }
        }    class XXX { //非静态内部类,不能直接通过 new 外部类.内部类 的方式生成实例,
                      //要通过 new 外部类实例.内部类 的方式生成实例
            public XXX() { //构造函数
                System.out.println("XXX");
            }
        }
    }public class Demo_s {
        public static void main(String args[]) {
            System.out.println("main enter");
            
            new AlertDialog();
            new AlertDialog.Builder(); //生成静态内部类实例        new AlertDialog().new XXX(); //生成非静态内部类实例
            
            System.out.println("main exit");
        }
    }
      

  2.   

    java 编程思想 11章要么  http://blog.csdn.net/zhao251021539/article/details/6647343我自己写的
      

  3.   

    输出:
    main enter
    --------------------------------
    AlertDialog constructor enter
    AlertDialog AAA enter
    AlertDialog AAA exit
    AlertDialog constructor exit
    --------------------------------
    Builder constructor enter
    Builder BBB enter
    Builder BBB exit
    Builder constructor exit
    --------------------------------
    AlertDialog constructor enter
    AlertDialog AAA enter
    AlertDialog AAA exit
    AlertDialog constructor exit
    Circle constructor enter
    Circle CCC enter
    Circle CCC exit
    Circle constructor exit
    --------------------------------
    main exitclass AlertDialog {
    //构造函数
    AlertDialog() {
    System.out.println("AlertDialog constructor enter");

    this.AAA(); //调用方法

    System.out.println("AlertDialog constructor exit");
    }

    void AAA() {
    System.out.println("AlertDialog AAA enter");

    System.out.println("AlertDialog AAA exit");
    }

    //静态内部类,可以直接通过 new 外部类.内部类 的方式生成内部类实例
    static class Builder {
    //构造函数
            Builder() {
             System.out.println("Builder constructor enter");
            
             this.BBB(); //调用方法
            
             System.out.println("Builder constructor exit");
            }
            
            void BBB() {
         System.out.println("Builder BBB enter");
        
         System.out.println("Builder BBB exit");
         }
    }

    //非静态内部类,不能直接通过 new 外部类.内部类 的方式生成实例,
        //要通过 new 外部类实例.内部类 的方式生成实例
    class Circle {
    //构造函数
    Circle() {
             System.out.println("Circle constructor enter");
            
             this.CCC(); //调用方法
            
             System.out.println("Circle constructor exit");
            }
            
            void CCC() {
         System.out.println("Circle CCC enter");
        
         System.out.println("Circle CCC exit");
         }
    }
    }public class Demo_s {
        public static void main(String args[]) {
         System.out.println("main enter");
        
         System.out.println("--------------------------------");
         new AlertDialog();
         System.out.println("--------------------------------");
         new AlertDialog.Builder(); //生成静态内部类实例
         System.out.println("--------------------------------");
         new AlertDialog().new Circle(); //生成非静态内部类实例    
         System.out.println("--------------------------------");
        
         System.out.println("main exit");
        }
    }
      

  4.   

    这已经说明了
    内部类要想直接通过外部类.内部类 必须声明成static
    new AlertDialog.Builder(); // 这种情况必须把内部类声明成static
      

  5.   

    内部类一般用得很少,在Swing中用的较多,一般都是匿名内部类