JAVA继承关系中静态代码块、非静态代码块的执行顺序

       类的代码在初次使用时才加载(每个类的编译代码都存在于它自己的独立文件中,.class文件),是指加载发生在创建类的第一个对象的时候,但是当访问static方法和static域的时候,也会发生加载(构造器也是static方法,只是static关键字没有显式的写出来)。类初次使用时也是static初始化的时候,所有的static对象和static代码段都会在加载时按照程序中的顺序(类中代码的书写顺序)依次初始化。static的对象或代码都只会初始化一次。而非静态代码块是在创建类的对象时顺序执行的。

       对于继承关系,在实例化一个类时,如果它存在父类,那么父类会先进行加载(按顺序执行static对象和static代码),如果此父类还有父类那么按照此规则先进行类的加载,然后是子类的加载(同样是按顺序执行static对象和static代码),待类加载都结束后,即可开始创建对象。

       创建对象时,首先是父类的基本类型被设置默认值,对象引用被设为null,非静态代码块的执行(前面的过程按照写代码的顺序),然后构造器会被自动调用,接着子类的的基本类型被设置默认值,对象引用被设为null,非静态代码块的执行(前面的过程按照写代码的顺序),然后构造器会被调用,对象创建完成。

       代码示例如下:

public class A {
	{
	        System.out.println("F");
	}
	
	private int i = 0;

	static {
		System.out.println("A");
	}
	
	{
		System.out.println(i);
	}
	
	public A(String temp) {
		this(temp, null);
	}
	
	public A(String temp1, String temp2) {
		System.out.println("X");
	}
	
}
public class B extends A {
	
	private int j = get();

	static {
		System.out.println("B");
	}
	
	private int get() {
	   System.out.println("get");
	   return 1;
	}
	
	{
		System.out.println("j2 = " + j);
	}
	
	{
		System.out.println("D");
	}
	
	public B() {
		super("nihao", "pengyou!");
		System.out.println("j1 = " + j);
	}
	
	public static void main(String[] args) {
		B b = new B();
	}
}


执行结果:

A
B
F
0
X
get
j2 = 1
D
j1 = 1

      


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值