下面两个代码(《java编程思想》P93)
代码一:public  class MethodInit2{
         int i=f();
         int j=g(i); int f(){
return 11;
}

int g(int n){
return n*10;
}
}
代码二:public  class MethodInit2{
         int j=g(i);
         int i=f(); int f(){
return 11;
}

int g(int n){
return n*10;
}
}
书上说代码二有误。对于代码二我陷入了困惑:①创建该类对象时,是不是先将i和j初始化为默认值(即将i和j初始化为默认值0),然后执行这两条语句(int j=g(i);int i=f();)的赋值运算,这样的话代码就无误了吧....②创建该类对象是将I初始化为默认值0后,紧接着执行语句int j=g(i)的赋值运算,这样的话代码就是错误的(因为i还没来得及初始化)...
小弟迷茫了。求拯救!!!

解决方案 »

  1.   

    代码二 是肯定有问题的。。编译都不能通过。。在int j=g(i);里面。。i变量还没有被声明。代码是顺序往下执行的
      

  2.   

    /*数据成员的初始化过程*/
    public class InitSequence{
    Tools ts1=new Tools();

    {
    System.out.println("Hello");
    }

    InitSequence(){
    System.out.println("InitSequence()");
    }

    public static void mian(String[] args){
    System.out.println("call Tools.t4.f(4) in main()");
    Tools.t4.f(4);
    System.out.println("Creating new Tools() in main()");
    new Tools();
    System.out.println("Creating new InitSequence() in main()");
    new InitSequence();
    }
    static Tools ts2=new Tools();

    }
    class Tools{
    Tool t1=new Tool(1);
    static Tool t3=new Tool(3);

    static{
    System.out.println("进入静态初始化快");
    t3=new Tool(33);
    t4=new Tool(44);
    System.out.println("退出静态初始化块");
    }

    {
    System.out.println("进入实例初始化快");
    t1=new Tool(11);
    t2=new Tool(22);
    System.out.println("退出实例初始化快");

    }

    Tools(){
    System.out.println("Tools()");
    t2=new Tool(222);

    }
    static Tool t4=new Tool(4);
    Tool t2=new Tool(2);

    }
    class Tool{
    Tool(int i){
    System.out.println("Tool("+i+")");

    }
    void f(int i){
    System.out.println("f("+i+")");
    }
    }这个原程序中,类Tools中t2在实力初始化块中就被赋值了,可是t2的声明语句在这之后啊,为什么能用???.....这是《java程序设计第二版》刘慧宁P87 上的一个源程序
      

  3.   

    你后面贴的代码里是static关键字的作用
      

  4.   

    出问题是因为i没有初始化,形象地说就是执行到int j=g(i);的时候编译器还不认识“i”是谁……
    因为int j=g(i);int i=f();这两条语句处于同等位置,所以必然会顺序执行。但是语句的执行顺序并不是你所编辑的顺序,这就涉及到了你的例子。你的例子里,虽然Tool t2=new Tool(2);写在Tools类的最后,但它实质的位置是类的成员。那么在类被实例化的时候,按顺序(1)引入成员变量(2)执行实例初始化块(3)执行构造方法
    所以按这个顺序,实例初始化块和构造方法中的t2已经被编译器“认识”,t2已经是初始化过的成员变量。总结:初始化变量代码是要在使用变量的代码之前执行,是执行!,与它表面上出现的位置无关。所以只要把它安排在会提前执行的位置就行~
    好吧……我可能说的不太清楚……见谅!
      

  5.   

    因为你的int j=g(i),int i=f()这类语句把定义和赋值写在一起了
    执行是从右到左
    因为还未执行int j的时候就已经执行了g(i),这时i没有定义或者被初始化,就会有错了
    假如你把它拆开写int j;j=g(i)的话就没有问话了
    执行到int j的时候系统就会给一个默认初始化的值0了