/**

  • 总结:
  • 1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。
  • 2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。
  • 3.实例化一个非静态的内部类的方法:
  • a.先生成一个外部类对象实例
  • OutClassTest oc1 = new OutClassTest();
  • b.通过外部类的对象实例生成内部类对象
  • OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();
  • 4.实例化一个静态内部类的方法:
  • a.不依赖于外部类的实例,直接实例化内部类对象
  • OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
  • b.调用内部静态类的方法或静态变量,通过类名直接调用
  • OutClassTest.InnerStaticClass.static_value
  • OutClassTest.InnerStaticClass.getMessage()
    */
package innerAndOutClass;

public class OutClass {
    static int a;
    int b;
    public static void outTest(){
        System.out.println("out class static function");
    }

    public OutClass(){
        InnerClass ic = new InnerClass();
        System.out.println("外部类创建一个内部类的实例");
    }

    //非静态内部类
    private class InnerClass{
        //只有在静态内部类中才能定义或者声明静态成员或者方法
        //private static String tt = "0";
        private int flag = 0;

        public InnerClass(){
            //非静态内部类可以访问外部类所有的静态非静态资源
            System.out.println("InnerClass creat a:" + a);
            System.out.println("InnerClass creat b:" + b);
            System.out.println("InnerClass creat flag:" + flag);

            //调用外部类的静态方法
            outTest();
        }
        private String getKey(){
            return "no-static-inner";
        }
    }
    //静态内部类
    private static class InnerStaticClass{
        private static String static_value = "static_value";
        private int flag = 0;

        public InnerStaticClass(){
            System.out.println("OutClass create a:" + a);
            //System.out.println("OutClass create b:" + b);
            System.out.println("InnerStaticClass flag:"+flag);
            System.out.println("InnerStaticClass static_value:"+static_value);
        }
        public static String getMessage(){
            return "inner static class function";
        }
    }

    public static void main(String[] args) {
        OutClass oc = new OutClass();
        //创建内部类实例的方法
        OutClass.InnerClass no_static_inner = oc.new InnerClass();
        System.out.println(no_static_inner.getKey());

        System.out.println(OutClass.InnerStaticClass.static_value);
        //不依赖于外部类的实例,直接实例化内部静态类
        OutClass.InnerStaticClass inner = new OutClass.InnerStaticClass();
        System.out.println(inner.flag);
        System.out.println(OutClass.InnerStaticClass.getMessage());
    }

}