黑马程序员技术交流社区

标题: 为什么这段代码运行输出的是 White? [打印本页]

作者: 贾文泽    时间: 2013-2-24 20:21
标题: 为什么这段代码运行输出的是 White?
  1. public class text {
  2.     public static void main(String[] args) {
  3.        
  4.        System.out.println(X.Y.Z);
  5.     }       
  6. }
  7. class X{
  8.         static class Y{
  9.                 static String Z="Black";
  10.         }
  11.         static C Y = new C();
  12. }
  13. class C{
  14.         String Z = "White";
  15. }
复制代码
为什么这段代码运行输出的是 White?
作者: 陈圳    时间: 2013-2-24 21:05
我查阅了一下文档,static被修饰后,相当于全局变量//C++的概念.也就是说static修饰后的变量或方法已经属于这个程序内所有类共用的.//类名.调用
可以被任何类使用.而内部类有访问局限.程序删除了class c之后,正常运行,
说明:在编译时,各个类中的静态成变和方法先初始化.初始化完了,再初始化内部类的...然后调用的时候也是按这个顺序来的.//这是我的理解.百度暂时找不到相关答案....
作者: 贾文泽    时间: 2013-2-24 21:26
陈圳 发表于 2013-2-24 21:05
我查阅了一下文档,static被修饰后,相当于全局变量//C++的概念.也就是说static修饰后的变量或方法已经属于这 ...

关键是这段代码能正常运行啊,并且输出 white
作者: 谢洋    时间: 2013-2-24 21:28
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";
}


作者: 孙传磊    时间: 2013-2-24 22:09
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象是,不生成static变量的副本,而是类的所有实例共享同一个static变量。
package qq;

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修饰的类成员,就是可以由一个类直接调用,为所有对象共有的变量
作者: 陈圳    时间: 2013-2-24 22:32
贾文泽 发表于 2013-2-24 21:26
关键是这段代码能正常运行啊,并且输出 white

是能被正常运行啊,我说了类似于C++的全局变量,就是在整个程序中都可以访问到的变量.只不过我们一直学java,java中只有static静态这样的概念,平时操作都在类中,感觉所有的对象或变量都有作用域.
作者: 黄嵘才    时间: 2013-2-25 14:21
谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2