java对象的创造过程

来源:互联网 发布:php 分割二维数组 编辑:程序博客网 时间:2024/04/26 20:33

本文摘抄自《Thinking in java 》

假设有一个名为Dog的类

1)当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类德静态方法/静态字段首次被访问时,java解析器必须查找类路径,以定位Dog.class文件。

2)然后载入Dog.class(这将创建一个Class对象),有关静态初始化的所有动作都会被执行。因此,静态初始化只在Class对象首次加载的时候进行一次。

3)当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的储存空间。

4)这块储存空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了缺省值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。

5)执行所有出现于字段定义处德初始化动作。

6)执行构造器。


接下来是一段静态字段和静态方法的初始化例子:

public class StaticInitialization static Table t2=new Table();static Cupboard t3 =new Cupboard();public static void main(String[] args) {// TODO Auto-generated method stubSystem.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);}}class Bowl{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);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); Cupboard(){System.out.println("Cupboard()");b4.f(2);}void f3(int marker){System.out.println("f3("+marker+")");}static Bowl b5=new Bowl(5);}

输出的结构为:

 

原创粉丝点击