日期:2014-05-20  浏览次数:20652 次

静态变量和非静态变量区别
这是第一段:
Java code
package org.cc.demo.JVMTest;

class Test{
    private static Test test=new Test();
    private static int i=5;
    private static int j=4;
    public Test(){
      System.out.println(i);
      System.out.println(j);
    }
    public static Test getInstance(){
        return test;
    }
}

public class JVMDemo01 {
    public static void main(String[] args) {
        
       Test t=Test.getInstance();
    }

}

这是第二段:
Java code
package org.cc.demo.JVMTest;

class Test{
    private static Test test=new Test();
    private int i=5;
    private int j=4;
    public Test(){
      System.out.println(i);
      System.out.println(j);
    }
    public static Test getInstance(){
        return test;
    }
}

public class JVMDemo01 {
    public static void main(String[] args) {
        
       Test t=Test.getInstance();
    }

}

按照JVM的加载 连接 初始化 可以知道第一段输出的是0 0
那么第二段的不是静态的 他是在什么完成i j的赋值的? 是在编译期还是什么时候? 打印出来5 4

------解决方案--------------------
在你new他的时候 我感觉。。
------解决方案--------------------
编译期可new不出来对象。当然是执行的时候,如1楼所说,new Test()的时候。

早期研究此类问题,可以增加大量的System.out.println();就比较容易了解情况了。

另外,你还可以试试在main里面只留下:
Class.forName("org.cc.demo.JVMTest.Test");
------解决方案--------------------
new Test()时赋值滴
------解决方案--------------------
new Test()时,调用构造器之前
------解决方案--------------------
探讨
引用:

new Test()时,调用构造器之前

...那在类加载到初始化的哪个阶段?

------解决方案--------------------
探讨
...那在类加载到初始化的哪个阶段?

------解决方案--------------------
第一段:new在前,ij还没有进行初始化所以为0
第二段:ij为成员变量,所以在new时要进行初始化
不知道对不对,你可以把ij放到new前面试试看
------解决方案--------------------
第二个:
2.2初始化的时候 从上向下执行 先private static Test test=new Test(); 
当然是这个时候,会初始化成员变量,再调用构造器。