A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾文泽 高级黑马   /  2013-2-24 20:21  /  1944 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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?

7 个回复

正序浏览
谢谢分享
回复 使用道具 举报
贾文泽 发表于 2013-2-24 21:26
关键是这段代码能正常运行啊,并且输出 white

是能被正常运行啊,我说了类似于C++的全局变量,就是在整个程序中都可以访问到的变量.只不过我们一直学java,java中只有static静态这样的概念,平时操作都在类中,感觉所有的对象或变量都有作用域.
回复 使用道具 举报
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修饰的类成员,就是可以由一个类直接调用,为所有对象共有的变量
回复 使用道具 举报
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 21:05
我查阅了一下文档,static被修饰后,相当于全局变量//C++的概念.也就是说static修饰后的变量或方法已经属于这 ...

关键是这段代码能正常运行啊,并且输出 white
回复 使用道具 举报
我查阅了一下文档,static被修饰后,相当于全局变量//C++的概念.也就是说static修饰后的变量或方法已经属于这个程序内所有类共用的.//类名.调用
可以被任何类使用.而内部类有访问局限.程序删除了class c之后,正常运行,
说明:在编译时,各个类中的静态成变和方法先初始化.初始化完了,再初始化内部类的...然后调用的时候也是按这个顺序来的.//这是我的理解.百度暂时找不到相关答案....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马