类初始化和实例初始化(自学笔记)

类初始化和实力初始化

类的初始化过程是怎样的,先后代码块的初始化顺序又是怎么样的。实例的初始化顺序又是怎么样的。现在我们来一一解答。

还是采用代码的方式慢慢解读。

public class Test4 extends Father {
	private int i=test();
	private static int j=method();
	static {
		System.out.print("6 ");
	}
	Test4() {
		System.out.print("7 ");
	}
	{
		System.out.print("8 ");
	}
	public int test() {
		System.out.print("9 ");
		return 1;
	}
	public static int method() {
		System.out.print("10 ");
		return 1;
	}
	public static void main(String[] args) {
		Test4 t4 = new Test4();
		System.out.println();
		Test4 test4 = new Test4();
	}
}
class Father {
	private int i = test();
	private static int j = method();
	static {
		System.out.print("1 ");
	}
	public Father() {
		System.out.print("2 ");
	}
	{
		System.out.print("3 ");
	}
	public int test() {
		System.out.print("4 ");
		return 1;
	}
	public static int method() {
		System.out.print("5 ");
		return 1;
	}
}


上面代码的运行顺序是多少?来我们一起看看。
在这里插入图片描述
为何会产生这样的顺序?
第一是类的初始化,执行 < clinit > 方法,编译器自动生成。该方法由静态代码块和静态类变量显示赋值代码组成。执行顺序为谁在上面谁先执行,且只执行一次。
子类和父类的初始化顺序是先初始化父类,再初始化子类。故开始的顺序为5,1,10,6。
第二就是实例的初始化,执行< init >()方法。也是编译器自动生成。
该方法由非静态实例变量显示赋值代码和非静态代码块,对应构造器代码组成。该方法可能重载多个,有几个构造器就有几个方法。
执行顺序,是非静态实例变量显示赋值代码和非静态代码块从上到下组成,对应的构造器最后执行。init方法的首行是super()及对应父类的该方法,且该方法写不写都在。所以最后的执行顺序为: super() -> 非静态实例变量显示赋值代码和非静态代码块 ->构造器。
按照原理来看最后的执行应该是4,3,2,9,8,7,但是为什么不是呢,这其中还涉及到方法的重写。

方法重写
非静态方法前面其实都有一个默认的对象this,this在构造器或者< init >(),他表示正在创建的对象。因为是创建子类的对象,所以test()执行的是子类从写的代码(面向对象多态)。所以最后的结果为9 3 2 9 8 7 。

哪些方法不可以被重写
final方法,
静态方法,
private等子类中不可见方法。
对象的多态性。
子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码。
非静态方法默认的调用对象是this。
this对象再构造器或者说< init> 方法中就是正在创建的对象。

综合上述
代码首先执行的是类的初始化只执行一次,然后实例的初始化随着创建的实例增加;clinit方法中静态代码块和静态类变量显示赋值代码执行顺序由上而下,init方法中非静态实例变量显示赋值代码和非静态代码块顺序由上而下,执行顺序为 super() -> 非静态实例变量显示赋值代码和非静态代码块 ->构造器。
最后结果分析为
类的初始化:5, 1, 10, 6
实例的初始化:
super() 9,3,2
非静态实例变量显示赋值代码 9
非静态代码块 8
无参构造 7
第一次实例化,5 ,1, 10, 6, 9, 3, 2, 9, 8, 7
第二次实例因为类初始化只执行一次不执行,最后的结果为 9, 3, 2, 9, 8, 7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值