下面两个代码(《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还没来得及初始化)...
小弟迷茫了。求拯救!!!
代码一: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还没来得及初始化)...
小弟迷茫了。求拯救!!!
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 上的一个源程序
因为int j=g(i);int i=f();这两条语句处于同等位置,所以必然会顺序执行。但是语句的执行顺序并不是你所编辑的顺序,这就涉及到了你的例子。你的例子里,虽然Tool t2=new Tool(2);写在Tools类的最后,但它实质的位置是类的成员。那么在类被实例化的时候,按顺序(1)引入成员变量(2)执行实例初始化块(3)执行构造方法
所以按这个顺序,实例初始化块和构造方法中的t2已经被编译器“认识”,t2已经是初始化过的成员变量。总结:初始化变量代码是要在使用变量的代码之前执行,是执行!,与它表面上出现的位置无关。所以只要把它安排在会提前执行的位置就行~
好吧……我可能说的不太清楚……见谅!
执行是从右到左
因为还未执行int j的时候就已经执行了g(i),这时i没有定义或者被初始化,就会有错了
假如你把它拆开写int j;j=g(i)的话就没有问话了
执行到int j的时候系统就会给一个默认初始化的值0了