初始化及类的加载

1.java中所有事物都是对象,每个类的编译代码都存在于它自己的独立文件中。该文件只在需要使用程序代码时才会被加载。一般来说,可以说:“类的对象在初次使用时才加载。”这通常是指加载发生于创建类的第一个对象之时,但是当访问static域或者static方法时,也会发生加载 。

初次使用之处也是static初始化发生之处。所有的static对象和static代码段都会在加载时依照程序中的顺序而依次初始化。注意,static的东西只会初始化一次。

 

<span style="font-size:14px;">package com.dqpi.cn;

class Animal{
	private int age = 20;
	protected int legs = 4;
	public Animal() {
		System.out.println("age=" + age +",legs=" + legs);
		legs = 2;
	}
	private static int x1 = printInit("static animal.x1 initialized");
	static int printInit(String s){
		System.out.println(s);
		return 47;
	}
}
public class Dog extends Animal{
	private int k = printInit("Dog.k initialized");
	public Dog(){
		System.out.println("k=" + k);
		System.out.println("legs=" + legs);
	}
	private static int x2 = printInit("static dog.x2 initialized");
	public static void main(String[] args) {
		System.out.println("dog constructor");
		Dog d = new Dog();
	}

}
</span>

运行结果:

 

 

<span style="font-size:14px;">static animal.x1 initialized
static dog.x2 initialized
dog constructor
age=20,legs=4
Dog.k initialized
k=47
legs=2
</span>

 

 

对上述的代码做以下的简单解释:当运行程序后,访问Dog.main()方法时,类加载器开始启动并找出该类的编译代码,在对他进行加载的过程中,编译器发现他有父类,因此继续进行加载,假设该父类还有父类,则继续会加载该父类的基类,依次类推。接下来,会加载根基类的static初始化,static会被执行,然后执行其子类中的static,依次类推,知道所有子类中的static执行完,才开始对象的创建,首先对象中所有的基本类型都会被设置为默认值,对象引用被设为null(这是通过将对象内存设为二进制零值而一举生成)。然后,基类的构造器就会被调用。基类的构造器和子类的构造器一样,以相同的顺序来经历相同的过程,在基类的构造器完成之后,实例变量按照其次序被初始化,最后构造器的其余部分被执行。

 

 

2.初始化的顺序

1)在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零

2)调用基类的构造器。这个步骤会不断地反复递归下去,首先是构造这种层次结构的根,然后是下一层的子类,等等,直到最低层的子类。

3)调用子类构造器的主体

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值