关于java中类嵌套的查询

public class Outer{

    public class Inner{

    }

}


public class Main {

    public static void main(String[] args) {

        Outer objOut = new Outer();

        //Outer.Inner object1= objOut.new Inner();  // runes without a problem

        //objOut.Inner object2= objOut.new Inner(); //gives error

    }

}

这听起来可能有点业余,但是,Outer.Inner与objOut.Inner.


ABOUTYOU
浏览 162回答 3
3回答

慕虎7371278

您不能将变量名称用作另一个变量的类型,而这正是您想要使用的objOut.Inner。变量的类型是Inner(或可选Outer.Inner)。因为Inner是一个内部类,所以它与其外部类的实例(其封闭实例)相关联。当您创建它的实例时,您可以选择指定与它关联的对象实例,这就是您正在使用objOut.new Inner.这个例子可能会让它更清楚一些:public class Example {    private String str;    public class Inner {        void show() {            // Show the string for the Example this Inner is part of            System.out.println(Example.this.str);        }    }    public Example(String s) {        this.str = s;    }    public static void main(String[] args) {        Example e1 = new Example("e1");        Example e2 = new Example("e2");        Inner i1 = e1.new Inner();        i1.show(); // "e1"        Inner i2 = e2.new Inner();        i2.show(); // "e2"    } }请注意该i1 Inner实例如何获取e1其封闭Example实例,因此看到e1s str,但又如何i2获取e2其封闭实例,因此它看到e2s str。有时候它不是可选的,例如在我Example上面的类中,因为new Inner使用了 where ,所以没有可以使用的默认实例。它在 的实例方法中是可选的Example,但在该static方法中不是可选的。

一只斗牛犬

两者都不能编译。为了使前者编译,应该声明一个变量,并给出该变量的名称。Outer.Inner obj = objOut.new Inner();即使您执行此步骤,后者也不会编译,因为它既objOut.Inner不是类型(因为主表达式objOut不是类型)也不是有效名称(因为在标识符 (jls-3.8).中不允许使用)。针对您的情况的简化规则(jls-14.4)是LocalVariableType VariableDeclaratorId [= VariableInitializer];

GCT1015

这个 :Outer.Inner = objOut.new Inner();不会编译,但如果你将其更改为:Outer.Inner object = objOut.new Inner();将意味着创建一个引用类的内部类实例Outer-objOut将是Outer类的实例。还有这个:objOut.Inner = objOut.new Inner();不会编译,因为objOut该类的实例Outer没有 poperty Inner。并不是Outer类知道类的实例Inner,而是Inner类实例知道Outer创建它的类实例。编辑该行:objOut.Inner object2= objOut.new Inner();将无法编译,因为Inner类型标识符属于Outer 类而不是此类的实例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java