Java的构造器初始化

Java–构造器初始化

变量初始化顺序

在类的内部,变量定义顺序决定了初始化顺序。并且,即使变量散布在类中的函数之间,变量仍然在方法(包括构造函数)之前初始化。

class Window{
	Window(int maker){
		System.out.println("window("+maker+")");
	}
}
class House{
	Window w1 = new Window(1);
	House(){
		System.out.println("House()");
		w3 = new Window(33);
	}
	Window w2 = new Window(2);
	void f() {System.out.println("f()");}
	Window w3 = new Window(3);
}
public class InitTest {
	public static void main(String[] args) {
		House h = new House();
		h.f();
	}
}

/* Output:
window(1)
window(2)
window(3)
House()
window(33)
f()
*/

从上面可以看出,new一个House对象h时,首先会将类中的所有变量(对象)初始化,然后才会执行House类的构造函数。

静态数据的初始化

无论创建多少个对象,静态数据都只占用一份储存区域。所以仅第一次创建一个类的对象时,静态成员会执行初始化动作。static 关键字不能应用于局部变量,因此只能作用于域。

我们稍对上面的代码进行修改:

class Window{
	Window(int maker){
		System.out.println("window("+maker+")");
	}
}
class House{
	Window w1 = new Window(1);
	House(){
		System.out.println("House()");
		w3 = new Window(33);
	}
	static Window w5 = new Window(5);
	Window w2 = new Window(2);
	void f() {System.out.println("f()");}
	Window w3 = new Window(3);
	static Window w4 = new Window(4);
}
public class InitTest {
	static Window w = new Window(6);
	public static void main(String[] args) {
		new House();
	}
	static Window ww = new Window(7);
}

/* Output:
window(321)
window(5)
window(4)
window(1)
window(2)
window(3)
House()
window(33)
*/

从输出可以看出,无论如何静态成员会在其他所有成员初始化之前、方法执行之前初始化。并且静态成员之间也是

按照定义的先后顺序进行初始化。

虽然构造器在变量和静态成员初始化后执行,实际上,构造器是静态方法

显式静态初始化

Java允许将多个静态初始化动作组织成一个特殊的“静态子句”(或者叫做“静态块”)。

如下:


class Window{
	Window(int maker){
		System.out.println("window("+maker+")");
	}
}
class House{
	static Window w1 = new Window(1);
	static Window w3,w2;
	static int count = 0;
	House(int maker){
		System.out.println("House("+maker+")");
	}
    static {
		w3 = new Window(3);
		w2 = new Window(2);
		System.out.println("executes "+(++count)+" times");
 	}
}
public class InitTest {
	static Window w = new Window(6);
	public static void main(String[] args) {
		new House(1);
		new House(2);
	}

	static Window ww = new Window(7);
}

/* Output:
window(6)
window(7)
window(1)
window(3)
window(2)
executes 1 times
House(1)
House(2)
*/

从上面可以看出,static作用的静态块看起来像是一个函数一样,只执行一次。当首次生成这个类的对象时,或者首次访问这个类的静态成员时执行。

非静态实例初始化

Java也有实例化初始化的语法,用于初始化非静态变量。它有点像静态块那样,不过区别在于:非静态实例初始化在每次创建对象时,都会执行初始化。


class Window{
	Window(int maker){
		System.out.println("window("+maker+")");
	}
}
class House{
	static Window w1 = new Window(1);
	static Window w3;
	Window w2;
	static int count = 0;
	House(int maker){
		System.out.println("House("+maker+")");
	}
    {
		w3 = new Window(3);
		w2 = new Window(2);
		System.out.println("executes "+(++count)+" times");
 	}
}
public class InitTest {
	static Window w = new Window(6);
	public static void main(String[] args) {
		new House(1);
		new House(2);
	}

	static Window ww = new Window(7);
}
/* Output:
window(6)
window(7)
window(1)
window(3)
window(2)
executes 1 times
House(1)
window(3)
window(2)
executes 2 times
House(2)
*/

可以注意到的是,如果代码块里有对静态成员的初始化,也会再次执行。并且也在构造器之前执行。

希望能对大家有帮助,有错误希望大家能指出,谢谢!

你可能感兴趣的:(Java的构造器初始化)