有人能解释一下为什么在这个片段中对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 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);
}
}
感谢您抽出时间
它没有什么特别有趣的地方,它可以归结为JLS指定的名称解析过程中的优先级。名称X.Y
不明确,两个选项之一必须优先。
如果你真的对血腥的细节感兴趣,JLS中有一整章都是关于这个主题的(我猜,一旦你意识到自己打开了一个多么大的马蜂窝,你的兴趣就会很快减弱:)
静态类和静态属性完全是两个不同的东西。像您所做的那样进行调用只引用类变量。class Y
不是A
的变量,而类成员C Y
是.
事实上,静态类和其他类一样。唯一的区别是它没有自己的.java
文件,并且它在逻辑上与包含类相关。但就是这样。如果明天你把class Y
从class A
中去掉,就不会有任何东西坏掉(假设你改变了你做过类似A.Y myY = new A.Y();
的事情的地方)。另一方面,变量public static C Y;
是class A
的一部分。
因为存在名称冲突,如果允许java编译器使用构造函数推断正确的名称冲突(例如System.out.println(new X.Y().Z);
),它就可以工作。