System.out.println(X.Y.Z);中:
拆开来开吧
X.Y是类C的一个实例,而Z又是这个对象的一个字段
X.Y.Z相当于:
C c = X.Y;
System.out.println(c.Z);
建议你把变量改成小写吧,搞到与类同名的变量都分不清了
这样子清晰多了:
public class text {
public static void main(String[] args) {
System.out.println(X.y.z);
C c = X.y;
System.out.println(c.z);
}
}
class X{
static class Y{
static String z="Black";
}
static C y = new C();
}
class C{
String z= "White";
}
public class text {
public static void main(String[] args) {
System.out.println(X.Y.Z);
}
}
class X{
static class Y{
static String Z="Black";
}
static C Y = new C();
}
class C{
String Z = "White";
}
如果不加static修饰的成员是对象成员,也就是归每个对象所有的。由main函数开始通过 x.y.z 来调用变量 z
static成员是不能被其所在class创建的实例访问的。所以函数会通过C类创建的y对象来调用变量 z
如果函数如下结果就不同了:
public class text {
public static void main(String[] args) {
System.out.println(X.Y.Z);
}
}
class X{
static class Y{
static String Z="Black";
}
// static C Y = new C(); 即将此行注释掉结果就会是 Black
}
class C{
String Z = "White";
}
这是因为 加static修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的
总结:如果在一个函数中通过明确的层级调用java虚拟机会优先调用不加static修饰的对象成员,也就是归每个对象所有的变量,
否则调用加static修饰的类成员,就是可以由一个类直接调用,为所有对象共有的变量