http://quicker.iteye.com/blog/548770
http://quicker.iteye.com/blog/548787
前两文已经对JAVA初始化作了说明,本文以一个例子进行补充。
规则:
-
Java程序执行前必须先加载,先定位加载开始类(public的类),若存在继承关系,由父类开始加载,加载时必须初始化static成员变量。
-
加载时若遇到新的类,必须先对该类进行加载,方法如上。
-
加载完后再执行,执行时由main()方法开始。若存在继承,调用子类的构造方法,必须先执行其父类的构造方法。
-
执行构造函数前必须先初始化该类的成员变量,但static成员变量只需要初始化一次。
-
成员变量不能用自身的构造函数进行初始化,除非声明其为static
代码示例:
class Goods{
Goods(){
System.out.println("goods");
}
}
class Meal {
static Meal ml = new Meal(1);
// private Meal s = new Meal(2); // stackOverFlow exception
//成员变量不能用自身的构造函数,除非声明为static.
private Bread b = new Bread(3);
Meal() { System.out.println("Meal()"); }
Meal(int i) { System.out.println("Meal()" + i); }
}
class Bread {
static Bread ml = new Bread(2);
Goods g = new Goods();
Bread() { System.out.println("Bread()"); }
Bread(int i) { System.out.println("Bread()" + i); }
}
class Lunch extends Meal {
Lunch() { System.out.println("Lunch()"); }
}
class PortableLunch extends Lunch {
PortableLunch() { System.out.println("PortableLunch()"); }
}
public class SandWich extends PortableLunch {
static Bread bb = new Bread();
private Bread b = new Bread();
public SandWich() { System.out.println("SandWich()"); }
public static void main(String[] args) {
System.out.println("---------------------------------------");
new SandWich();
}
}
如果能说出代码结果就表明过关。。
goods
Bread()2
goods
Bread()3
Meal()1
goods
Bread()
---------------------------------------
goods
Bread()3
Meal()
Lunch()
PortableLunch()
goods
Bread()
SandWich()
针对代码中:
class Meal {
static Meal ml = new Meal(1);
// private Meal s = new Meal(2); // stackOverFlow exception
//成员变量不能用自身的构造函数,除非声明为static.
private Bread b = new Bread(3);
Meal() { System.out.println("Meal()"); }
Meal(int i) { System.out.println("Meal()" + i); }
}
// private Meal s = new Meal(2); // stackOverFlow exception
上面代码当声明为static的时候,只初如化一次,而非static声明Meal的实例,在调用构造函数之前需要初始化Meal类的成员变量,这样会不断地重复动作,最后抛出异常。
类似下面这段代码:
class Meal {
static Meal ml = new Meal(1);
// private Meal s = new Meal(2); // stackOverFlow exception
//成员变量不能用自身的构造函数,除非声明为static.
private Bread b = new Bread(3);
Meal() { System.out.println("Meal()"); }
Meal(int i) { System.out.println("Meal()" + i); }
public static void main(String[] args) {
new Meal();
}
}
这个问题下贴有表述:
http://hi.baidu.com/yang1101190/blog/item/beb856c34c47865eb219a875.html