Java 静态Nestest类,静态属性访问。脑筋急转弯
有人能解释一下为什么在这个片段中对X.Y.Z的调用等同于C.Z吗? 调用X.Y.Z意味着: -它静态访问类X 然后 -属性Y-类型为C-(非类别Y) 然后 -C中的属性Z导致输出“生活就是痛苦” 但是为什么调用X.Y访问属性而不是类呢? 这背后的理论是什么Java 静态Nestest类,静态属性访问。脑筋急转弯,java,static,field,Java,Static,Field,有人能解释一下为什么在这个片段中对X.Y.Z的调用等同于C.Z吗? 调用X.Y.Z意味着: -它静态访问类X 然后 -属性Y-类型为C-(非类别Y) 然后 -C中的属性Z导致输出“生活就是痛苦” 但是为什么调用X.Y访问属性而不是类呢? 这背后的理论是什么 public class A { public static class X { public static class Y { public static String Z = "life i
public class A {
public static class X {
public static class Y {
public static String Z = "life is good";
}
public static C Y;
}
public static class C {
public static String Z = "life is pain";
}
public static void main(String[] args) {
System.out.println(X.Y.Z);
}
}
感谢您抽出时间静态类和静态属性是完全不同的两件事。如您所做的那样进行调用只引用类变量<代码>类别Y不是
a
的变量,而类别成员cy
是
事实上,静态类与任何其他类一样。唯一的区别是它没有自己的.java
文件,并且在逻辑上与包含的类相关。但就是这样。
如果明天你从
A级
中选择Y级
,什么都不会发生(假设你改变了你做过类似A.Y myY=new A.Y();
)的事情的地方)。另一方面,变量publicstaticcy
是类a的一部分,因为存在名称冲突,如果允许java编译器使用构造函数推断正确的名称(例如,System.out.println(new X.Y().Z);
它可以工作)。没有什么特别有趣的地方,根据JLS的规定,这取决于名称解析过程中的优先顺序。名称X.Y
不明确,必须优先选择其中一个
如果你真的对这些血淋淋的细节感兴趣,那么在这个问题上会有一个很好的答案(我猜,一旦你意识到你打开了一个什么样的黄蜂窝,你的兴趣就会很快减弱:)当变量
public static cy
shadowspublic static class Y
时,它被称为“阴影”。所以当你调用X.Y.Z
事实上你调用了X->C类型的变量Y->C类的静态变量Z
这段代码让我看起来很傻(花了很多时间才真正理解幕后的情况),是的@AlexeyA。是的,这不是JVM;这是编译器。@MarkoTopolnik很好。我需要更多的咖啡。