首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么`Outer.Inner inner = o.new Inner();` `Outer.Inner inner = o.new Outer.Inner();‘?

为什么`Outer.Inner inner = o.new Inner();` `Outer.Inner inner = o.new Outer.Inner();‘?
EN

Stack Overflow用户
提问于 2019-05-22 19:32:00
回答 3查看 509关注 0票数 3
代码语言:javascript
复制
class Outer {    
    class Inner {       

    }    
}

public class Demo {
    public static void main(String args[]) {

        Outer o = new Outer();
        Outer.Inner inner = o.new Inner();    

    }    
}

为什么是

代码语言:javascript
复制
Outer.Inner inner = o.new Inner();

代码语言:javascript
复制
Outer.Inner inner = o.new Outer.Inner();

也就是说,为什么用外部类名限定inner的类型声明,而不用外部类名限定内部类的构造函数?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-22 19:48:43

JLS 15.9中,您讨论的是一个限定类实例创建表达式。

限定类实例创建表达式以一个新的Primary表达式或一个ExpressionName开始

(您的表达式以主表达式开头)

语法如下:

ClassInstanceCreationExpression: UnqualifiedClassInstanceCreationExpression ExpressionName .UnqualifiedClassInstanceCreationExpression小学UnqualifiedClassInstanceCreationExpression UnqualifiedClassInstanceCreationExpression: new TypeArguments ClassOrInterfaceTypeToInstantiate ( ArgumentList ) ClassBody ClassOrInterfaceTypeToInstantiate:{注释}标识符{.{注释}标识符} TypeArgumentsOrDiamond TypeArgumentsOrDiamond: TypeArguments <>

稍低一点,在15.9.1,它说:

IdentifierClassOrInterfaceTypeToInstantiate中必须明确表示可访问的、非最终的、非枚举类型的内部类,以及Primary表达式或ExpressionName编译时类型的成员。否则,会发生编译时错误.

因此,它必须是表达式类型的成员。因此,没有必要对其进行限定,因为它只能是Outer中的一个类。

必须指定Outer.是多余的。

票数 2
EN

Stack Overflow用户

发布于 2019-05-22 19:38:47

因为o已经是一个Outer类型的实例,所以您不需要创建另一个Outer实例来创建Inner实例。您所列出的第二个选项意味着您要在顶级Outer中创建另一个名为Outer的内部类的实例,而这个实例并不存在,它将给出一个错误。(编辑:刚刚注意到o.new Outer后面没有括号,这让我觉得你可能有我的第二段的推理)。

如果您的意思是Outer.Inner()应该是构造函数,而不仅仅是Inner(),那是因为Outer.Inner()意味着Inner是一个静态的内部类。从未指定过static,因此您需要一个Outer实例。

票数 4
EN

Stack Overflow用户

发布于 2019-05-22 19:38:08

供比较:

代码语言:javascript
复制
public class Demo {
    public static void foo(){
       System.out.println("Hello world!");
    }
}

我们可以通过两种方式foo

1)

代码语言:javascript
复制
Demo.foo();  // with Demo qualifier

2)

代码语言:javascript
复制
Demo d = new Demo();
d.foo();  // without Demo qualifier!
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56263745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档