class A{


private static A obj=new A();
public static int num1;

public static int num2=0;

private A(){
num1++;
num2++;
//ystem.out.println(+num1);
//ystem.out.println(+num2);
}

public static A getInstance(){
return obj;
}
}public class Test{

public static void main(String[] args){
A obj=A.getInstance();
System.out.println("obj.num1="+obj.num1);
System.out.println("obj.num2="+obj.num2);
}
㈠执行时,是从main方法开始呢,还是先加载主类(Test)然后执行main方法?㈡main方法中执行到A obj=A.getInstance();时,停下来加载类A,是不是类A的静态成员变量(obj,num1,num2)初始化为默认值(Obj=null,num1=0;num2=0)后就加载完成了?如果没执行完,是不是继续执行private static A obj=new A();public static int num2=0;这两条语句(即将obj实例化,赋给num2指定的值),可是在执行语句private static A obj=new A();时,我陷入了困惑:类A还没有加载完成,能创建类A的对象吗?能创建的话,直接调用构造方法吗?小弟研究了好久,不得其解。诚请教!

解决方案 »

  1.   

    1. 你可以看看这段程序编译出来的字节码。 字节码很好读,有很多工具可以帮助你
    2. 不想看字节码,可以在CLass A 和 Class Test里加上 staic{语句块}打印一些信息,你也就知道执行顺序了
    3. 最后,看看JVM规范,可以告诉你为啥执行顺序是这个样子的
    我建议你自己研究一下,这样印象深刻,比较有成就感
      

  2.   


    class AB {
    static{
    System.out.println("我来了AB");
    }
    private static AB obj = new AB();
    public static int num1; public static int num2 = 0; private AB() {
    System.out.println("我来了AB构造函数");
    num1++;
    num2++;
    // ystem.out.println(+num1);
    // ystem.out.println(+num2);
    } public static AB getInstance() {
    System.out.println("我来了实例");
    return obj;
    }
    }
    public class CsdnTest {
    static{
    System.out.println("我来了CsdnTest");
    }
    public static void main(String[] args) {
    System.out.println("我来了main");
    AB obj = AB.getInstance();
    System.out.println("obj.num1=" + obj.num1);
    System.out.println("obj.num2=" + obj.num2);
    }
    }输出:
    我来了CsdnTest
    我来了main
    我来了AB
    我来了AB构造函数
    我来了实例
    obj.num1=1
    obj.num2=0
    LZ看到这个结果。。你的问题就不需要一一再回答了吧?
      

  3.   

    这问题不是有人问过吗- -
    懒的找帖子。。直接打字算了
    1.先加载主类
    2.当执行getInstance()时 先加载类A 类A加载完了
    然后开始加载private static A obj=new A();
    此时 NUM1 NUM2的值都为1 
    然后继续加载public static int num1和 public static int num2=0就是这样- -
      

  4.   


    原因是:num1在声明的时候没有直接赋值,所以后面num1++等于在进行赋值。所以是1。
    num2在声明时直接赋值了。static修饰不能改变值了。。所以是0(0是因为int型默认的)。去掉静态就能看见变化了