使用一个内部类名和对象名称相同的Java(Using an inner class name and

2019-08-01 13:19发布

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

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
    }
}

Outer内部具有静态类名为Inner 。 另外,声明类的对象(静态) Optionalstatic Optional Inner = new Optional();

该对象和类名(类内Outer )是相同的,其是Inner 。 该程序将显示Optional 。 唯一表达Outer.Inner.objmain()预期显示Inner但它没有。 实际产量却Optional这是的情况下, Optional类。

显示的一种方式Inner是通过改变对象名称来别的东西。

static Optional Inner1 = new Optional();

从它显示输出,看来对象名称(或可变)被选择在类型名称(类Inner ),因为它们具有相同的名称。 这里采用什么确切的情况?

Answer 1:

第6.4.2 Java语言规范中有大约在这种情况下适用的规则的一些信息。

在上下文在那里它可以潜在地被解释为一个可变,类型,或一个包的名称可能会出现一个简单的名称。 在这些情况下,的§6.5的规则指定的变量将优先被选择为一个类型 ,以及一个类型将优先被选择为一个包。 因此,有时可能无法指通过其简单的名称的可见类型或包声明。 我们说,这样的声明是模糊的。

这是指段落6.5确定一个名字的含义 ,这也解释了详细的规则。

在你的榜样, Outer.Inner可以参考命名嵌套类的类型Inner ,或静态成员变量Inner 。 规则说的变量将在类型选择。



Answer 2:

实际上,类名是外$内。

内部类基本上是在Java 1.1中引入了黑客攻击。 在JVM实际上并没有一个内部类的任何概念,所以编译器必须bodge它。 编译器生成 B 的“外部” A ,但在相同的封装 ,然后将合成的 存取/构造它,以允许A得到它的访问。

结帐以下职位:

的Java内部类的可见性的难题



Answer 3:

想想内部类实际上已经有自己的java文件中。 为什么选择变量在内部类,会清楚你的。



文章来源: Using an inner class name and an object name same in Java