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