在下面的代码片段中,大概看起来应该会发出一些编译错误,但事实并非如此:
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
。此外,它还声明了该类的一个对象(静态)Optional
(static Optional Inner = new Optional();
)
该对象和类名称(在类内部Outer
)是相同的Inner
。程序显示Optional
。唯一的表达Outer.Inner.obj
within main()
预计将显示Inner
但事实并非如此。然而实际输出是Optional
就是这种情况Optional
class.
一种显示方式Inner
是将对象名称更改为其他名称。
static Optional Inner1 = new Optional();
从它显示的输出来看,似乎是选择对象名称(或变量)而不是类型名称(类Inner
)因为他们有相同的名字。这里应用的具体案例是什么?
第 6.4.2 段 http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.4.2Java 语言规范的部分内容包含有关适用于这种情况的规则的一些信息。
简单名称可能出现在可能被解释为变量、类型或包的名称的上下文中。在这些情况下,§6.5 的规则规定:将优先选择变量而不是类型,并且将优先选择类型而不是包。因此,有时可能无法通过其简单名称来引用可见类型或包声明。我们说这样的声明是obscured.
这是指段落6.5 确定名称的含义 http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.5,其中详细解释了规则。
在你的例子中,Outer.Inner
可以引用名为的嵌套类的类型Inner
,或静态成员变量Inner
。规则规定将选择变量而不是类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)