这是第一段:
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();
}}
这是第二段:
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

解决方案 »

  1.   

    在你new他的时候 我感觉。。
      

  2.   

    编译期可new不出来对象。当然是执行的时候,如1楼所说,new Test()的时候。早期研究此类问题,可以增加大量的System.out.println();就比较容易了解情况了。另外,你还可以试试在main里面只留下:
    Class.forName("org.cc.demo.JVMTest.Test");
      

  3.   

    那个不好意思奈 我是说...不用static的例子2 你的意思是不是说就是只要一使用到Test类它 就会在类初始化前就赋值好?
    那它(非静态变量赋值)是在 加载 连接 初始化的 哪个阶段或哪个中间阶段完成的?
    你说的只留那个一样是主动使用和原来我用的没有区别的吧
      

  4.   

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

  5.   


    类定义加载到 private static Test test=new Test(); 的时候,为了完成对test初始值设置,不得不执行new Test()。
      

  6.   

    第一段:new在前,ij还没有进行初始化所以为0
    第二段:ij为成员变量,所以在new时要进行初始化
    不知道对不对,你可以把ij放到new前面试试看
      

  7.   

    那个第一个的话是:
    对于静态变量i j的话是:
    0.调用了Test类的静态方法
    1.加载Test类
    2.然后进行连接:
       2.1.在准备的时候 将static变量进行初始化设为默认值 test=null; i=0; j=0; 
       2.2初始化的时候 从上向下执行 先private static Test test=new Test(); 然后打印出此时i j的值都为0
       2.3轮到i j初始化i=4 j=5那么对于非静态的i j也就是第二个例子的
    他的 i=4和j=5 是在以上哪一步之前的之间之后的?.......那个这个是我问题的本意...发帖没说明白 不好意思
      

  8.   

    第二个:
    2.2初始化的时候 从上向下执行 先private static Test test=new Test(); 
    当然是这个时候,会初始化成员变量,再调用构造器。