在Java中使用相同的内部类名和对象名

Tin*_*iny 12 java inner-classes static-classes

在下面的代码片段中,可能看起来它应该发出一些编译错误,但它不会:

class Outer {
    public static class Inner {
        static String obj = "Inner";
    }

    static Optional Inner = new Optional();
    //The (inner) class name and the object name are same.
}

class Optional {
    String obj = "Optional";
}

public class Main {

    public static void main(String[] args) {
        System.out.println(Outer.Inner.obj);
        //Refers to the string inside the optional class
    }
}
Run Code Online (Sandbox Code Playgroud)

该类中Outer有一个名为static的静态类Inner.另外,它声明了一个对象(静态)类Optional(static Optional Inner = new Optional();)

这个对象和类名(在类中Outer)是相同的Inner.程序显示Optional.预期Outer.Inner.obj内部唯一的表达式main()会显示,Inner但事实并非如此.然而Optional,实际输出是Optional该类的情况.

显示的一种方法Inner是将对象名称更改为其他名称.

static Optional Inner1 = new Optional();
Run Code Online (Sandbox Code Playgroud)

从它显示的输出中,似乎对类型名称(类Inner)选择了对象名称(或变量),因为它们具有相同的名称.这里适用的具体情况是什么?

Jes*_*per 14

Java语言规范的第6.4.2段提供了有关在这种情况下适用的规则的一些信息.

一个简单的名称可能出现在上下文中,它可能被解释为变量,类型或包的名称.在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包.因此,有时可能无法通过其简单名称引用可见类型或包声明.我们说这样的声明是模糊的.

这是指第6.5确定名称的含义,它详细解释了规则.

在您的示例中,Outer.Inner可以引用名为嵌套类的类型Inner,或静态成员变量Inner.规则说将在类型上选择变量.