读 Thinking in Java 笔记(1)

读 《Thinking in Java》 笔记 (1)

请看下面这个例子 (结构简单,但各种创建可能会有点晕,你可以通过它推出正确的打印顺序,就基本过关了,这里还包含了静态成员)

package study;

class Bowl {
	public Bowl(int marker) {
		System.out.println("Bowl(" + marker + ")");
	}
	void f(int marker) {
		System.out.println("f(" + marker + ")");
	}
}

class Table {
	static Bowl b1 = new Bowl(1);
	public Table() {
		System.out.println("Table()");
		b2.f(1);
	}
	void f2(int marker) {
		System.out.println("f2(" + marker + ")");
	}
	static Bowl b2 = new Bowl(2);
}

class Cupboard {
	Bowl b3 = new Bowl(3);
	static Bowl b4 = new Bowl(4);
	public Cupboard() {
		System.out.println("Cupboard()");
		b4.f(2);
	}
	void f3(int marker) {
		System.out.println("f3(" + marker +")");
	}
	
	static Bowl b5 = new Bowl(5);
}

public class S {
	public static void main(String[] args) {
		System.out.println("Creating new Cupboard() in main");
		new Cupboard();
		System.out.println("Creating new Cupboard() in main");
		new Cupboard();
		t2.f2(1);
		t3.f3(1);
	}
	
	static Table t2 = new Table();
	static Cupboard t3 = new Cupboard();

}

 输出结果:

 static初始化只有在必要的时候才会进行。如果不创建一个Table对象,而且永远都不引用 Table.b1或Table.b2,那么static    Bowl  b1和b2永远都不会创建。然而,只有在创建了第一个Table 对象之后(或者发生了第一次static访问),它们才会创建。在那以后,static对象不会重新初始化。初始化的顺序是首先static(如果它们尚未由前一次对象创建过程初始化),接着是非 static对象。大家可从输出结果中找到相应的证据。

总结一下对象的创建过程(后续随着学习的深入还会扩展)

在这里有必要总结一下对象的创建过程。请考虑一个名为Dog的类:
(1)类型为Dog的一个对象首次创建时,或者Dog类的static方法/static字段首次访问时,Java解释器必须找到Dog.class(在事先设好的类路径里搜索)。
(2)找到Dog.class后(它会创建一个Class对象,这将在后面提及),它的所有static初始化模块 都会运行。因此,static初始化仅发生一次——在Class对象首次载入的时候。
(3)创建一个new Dog()时,Dog对象的构建进程首先会在内存堆(Heap)里为一个Dog对象分 配足够多的存储空间。
(4)这种存储空间会清为零,将Dog中的所有基本类型设为它们的默认值(零用于数字,以及 boolean和char的等价设定)。
(5)进行字段定义时发生的所有初始化都会执行。
(6)执行构建器(存在更多细节)。 

猜你喜欢

转载自blog.csdn.net/zjx1230/article/details/86621520