Java初始化顺序

      无论创建多少个对象,静态数据只占一份存储区域(方法区里)。static关键字不能用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本的数据类型的标准;如果它是一个引用,那么会获得初始值null。

package com.test;

public class Test {
	public static void main(String[] args){
		System.out.println("进入main函数");
		new Cupboard();
	}
	static Table table = new Table();
	public Bowl bowl = new Bowl(10);
}

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

class Table extends Cupboard{
	Bowl bowl1 = new Bowl(1);
	static Bowl bowl2 = new Bowl(2);
    static{
    	Bowl bowl3 = new Bowl(3);
    }
    {
	    Bowl bowl4 = new Bowl(4);
    }
    Table() {
	    System.out.println("Table()");
    }
    Bowl bowl5 = new Bowl(5);
    static Bowl bowl6 = new Bowl(6);
	
}
class Cupboard{
	Bowl bowl1 = new Bowl(7);
	Cupboard() {
		System.out.println("Cupboard()");
	}
}
输出:


总结一下对象的创建过程,假设有个名为Dog的类:

  1、即使没有显示地使用static关键字,构造器实际也是静态方法。因此,当首次创建类型为Dog的对象时(构造器可看成是静态方法),或者Dog的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。

  2、然后加载Dog.class,有关静态初始化的所有动作全部被执行。因此,静态初始化只在Class对象首次加载时执行一次。

  3、当用new Dog()创建对象的时候,首次将在堆上对Dog对象分配内存空间。

  4、这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值,引用类型则为null。

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

  6、执行构造器,访问父类


参考自《Java编程思想》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值