java中变量初始化的问题

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)

展开阅读全文

没有更多推荐了,返回首页