public class Outer {
public class Inner{

}
void f(){
new Inner();//此处为什么不用创建外部类实例就能创建内部类实例
}
static void g(){
//在静态方法中为什么要先创建外部类实例才能创建内部类的实例

Outer.Inner in = new Outer().new Inner();
}
}

解决方案 »

  1.   

    Outer outerObject = new Outer();Inner innerObject = new outerOjbect.Inner();Inner.class 对象属于 outerOjbect对象,不属于 Outer.class 对象 -----------------------
    如果是 static InnerInner.class 对象不属于 outerOjbect对象,属于 Outer.class 对象
    Inner innerObject = new Outer.Inner();
      

  2.   

    void f(){
            new Inner();//此处为什么不用创建外部类实例就能创建内部类实例
        }
    因为这相当于是外部类的成员函数,隐含了thisstatic void g(){
            //在静态方法中为什么要先创建外部类实例才能创建内部类的实例
            
            Outer.Inner in = new Outer().new Inner();
        }
    因为static函数不输入某个具体的对象,而是属于整个类。所以必须得创建外部类的一个对象
      

  3.   

    恩,完全可以将new Inner()当成是一个内部的方法来看待,因为在定义的时候采用的是非static 的所以在static方法中必须要新建一个实例在创建对应实例的内部类。而在non-static中相当于采用了this.
      

  4.   

    static的方法不能访问非static的内部类,这跟static方法不能访问非static成员变量是同个道理。但这里如果定义一个新的对象,然后用对象来访问内部类是被允许的。
      

  5.   

    public class Outer {
        public class Inner{
            
        }
        void f(){
            这里可以直接引用外部类的属性
        }
        static void g(){
            //静态方法,是不可以调用非静态的属性;静态代码块是在类加载的时候,就开始加载了
            
            Outer.Inner in = new Outer().new Inner();
        }
    }
      

  6.   

        void f(){
            new Inner();
        }
    这个是非静态方法,也就是没有static修饰,所以要引用这个方法,应该是实例化外部类,才可以引用
       static void g(){
            
            Outer.Inner in = new Outer().new Inner();
        }
    这个是静态方法,要使用它可以直接这样:Outer.g();这样才对的
      

  7.   

    总结起来就是:第一个方法是普通方法,暗含了一个this引用,普通方法是不能通过类名.方法名引用的,所以只有创建实例的时候才可以用,也就是有this的引用,所以在创建内部类的实例时,外部类的实例必须已经存在