Java 静态Nestest类,静态属性访问。脑筋急转弯

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

有人能解释一下为什么在这个片段中对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);
    }
}

感谢您抽出时间

静态类和静态属性是完全不同的两件事。如您所做的那样进行调用只引用类变量<代码>类别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
shadows
public static class Y
时,它被称为“阴影”。所以当你调用
X.Y.Z
事实上你调用了
X->C类型的变量Y->C类的静态变量Z
这段代码让我看起来很傻(花了很多时间才真正理解幕后的情况),是的@AlexeyA。是的,这不是JVM;这是编译器。@MarkoTopolnik很好。我需要更多的咖啡。