为了账号安全,请及时绑定邮箱和手机立即绑定

关于java中类嵌套的查询

关于java中类嵌套的查询

ABOUTYOU 2023-08-16 17:27:40
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.
查看完整描述

3 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

您不能将变量名称用作另一个变量的类型,而这正是您想要使用的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实例,因此看到e1str,但又如何i2获取e2其封闭实例,因此它看到e2str


有时候它不是可选的,例如在我Example上面的类中,因为new Inner使用了 where ,所以没有可以使用的默认实例。它在 的实例方法中是可选的Example,但在该static方法中不是可选的。


查看完整回答
反对 回复 2023-08-16
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

两者都不能编译。

为了使前者编译,应该声明一个变量,并给出该变量的名称。

Outer.Inner obj = objOut.new Inner();

即使您执行此步骤,后者也不会编译,因为它既objOut.Inner不是类型(因为主表达式objOut不是类型)也不是有效名称(因为在标识符 (jls-3.8).中不允许使用)。

针对您的情况的简化规则(jls-14.4)是

LocalVariableType VariableDeclaratorId [= VariableInitializer];


查看完整回答
反对 回复 2023-08-16
?
GCT1015

TA贡献1827条经验 获得超4个赞

这个 :

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 而不是此类的实例。


查看完整回答
反对 回复 2023-08-16
  • 3 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信