java中所有的变量在使用之前必须得到初始化,例如下面的句子;
void f() {
int i;
i++;
}
函数中的i没有进行初始化工作就进行相加,这样是行不通的。
在一个类执行构造函数创建对象之前,会对类中的所有变量进行初始化工作,变量包括了基本的数据类型和创建的类对象。例如:
class Bowl {
int i;
Bowl() {
System.out.println("Bowl");
System.out.println(i);
}
}
在这个Bowl类中i会产生一个默认的值,整数类型默认值为0;如果成员变量为类:如下:
package mian4;
class Bowl {
Bowl(int mark) {
System.out.println("Bowl("+mark+")");
}
void f1(int mark) {
System.out.println("f1("+mark+")");
}
}
class Table {
Bowl bowl = new Bowl(1);
Table(int mark) {
System.out.println("Table("+mark+")");
bowl.f1(1);
}
void f2(int mark) {
System.out.println("f2("+mark+")");
}
}
class StaticInitialization {
public static void main(String args[]){
System.out.println("new Table");
new Table(1);
}
}
最后输出结果为:
new Table
Bowl(1)
Table(1)
f1(1)
在main方法中创建Table(1)对象时,首先会调用Bowl bowl = new Bowl(1) 创建bowl这个对象,然后在调用自身的构成函数来创建Table(1)对象。
如果类中包含了静态成员变量,则情况会比较复杂,如下例子:
package mian4;
class Bowl {
Bowl(int mark) {
System.out.println("Bowl("+mark+")");
}
void f1(int mark) {
System.out.println("f1("+mark+")");
}
}
class Table {
Bowl bowl = new Bowl(1);
static Bowl bowl2 = new Bowl(2);
Table(int mark) {
System.out.println("Table("+mark+")");
bowl.f1(1);
}
void f2(int mark) {
System.out.println("f2("+mark+")");
}
static Bowl bowl3 = new Bowl(3);
}
class StaticInitialization {
public static void main(String args[]){
System.out.println("new Table");
new Table(1);
}
static Bowl bowl4 = new Bowl(4);
}
记住,首先如果类中有静态成员变量,则静态成员变量会首先被初始化,等静态成员变量全都初始化完后,再执行普通变量。所以,上述例子中static Bowl bowl4 = new Bowl(4)首先会被初始化。等bowl4初始化完成之后,就开始执行main方法。创建new Table(1)对象,在调用Table构造方法之前,会先初始化Table中的成员变量。按照静态变量先执行的原则,bowl2,bowl3对象会先创建,然后就是bowl,最后才是Table()对象。最后的输出结果如下:
Bowl(4)
new Table
Bowl(2)
Bowl(3)
Bowl(1)
Table(1)
f1(1)
由于静态变量是共用内存空间的,这个变量创建过程就执行一次。看下面的代码:
package mian4;
class Bowl {
Bowl(int mark) {
System.out.println("Bowl("+mark+")");
}
void f1(int mark) {
System.out.println("f1("+mark+")");
}
}
class Table {
Bowl bowl = new Bowl(1);
static Bowl bowl2 = new Bowl(2);
Table(int mark) {
System.out.println("Table("+mark+")");
bowl.f1(1);
}
void f2(int mark) {
System.out.println("f2("+mark+")");
}
static Bowl bowl3 = new Bowl(3);
}
class StaticInitialization {
public static void main(String args[]){
System.out.println("new Table");
new Table(1);
}
static Table table4 = new Table(4);
}
首先,在执行main方法之前会对table4对象进行初始化,当调用Table构造函数之前bowl2,bowl3对象都会被依次创建,这两个对象均为静态成员变量。执行main方法后又创建了一个Table()对象,由于bowl2,bowl3已经被创建过了,这时候就不会再进行创建工作,而只会创建bowl这个变量。执行结果如下:
Bowl(2)
Bowl(3)
Bowl(1)
Table(4)
f1(1)
new Table
Bowl(1)
Table(1)
f1(1)