黑马程序员-java-类实例化过程中初始化的顺序

-------android培训java培训、期待与您交流! ----------
今天看了个问题问的是类实例化过程中初始化的顺序。
虽然知道类的初始化顺序是:
父类静态块 --> 子类静态块 --> 父类自由块 --> 父类构造函数块 --> 子类自由块 --> 子类构造函数块
但是其中还是不太了解,所以写了一个测试的类(包含了接口、抽象类、父类、子类),然后debug一步一步调试,记录执行的语句
代码的注释为运行的顺序:
package com.Lland.TestInitializationOrder;
/**
 * @discription 测试创建类实例初始化过程中调用顺序
 * @author Lland
 * @time 2012年11月13日 02:15:37
 */
public class MainClass {
	public static void main(String[] args) {
		Child child = null;//1
		child = new Child();//2,12,29
	}
}
abstract class Person{
	public static String abstractStaticField = "抽象人类静态变量";//3
	public String abstractField = "抽象人类变量";//17
	static {
		System.out.println(abstractStaticField);//4
		System.out.println("抽象人类静态初始化块");//5
	}
	{
		System.out.println(abstractField);//18
		System.out.println("抽象人类初始化块");//19
	}
	public Person(){//15 //16进入Object类
		System.out.println("抽象人类构造器");//20
	}
	public abstract void abstractPersonPrint();
	public void personPrint(){
		System.out.println("抽象人类非抽象方法");
	}
}
interface FatherInterface{
	public static final String fatherInterfaceField = "父类接口常量";
	public void fatherPrint();
}
class Father extends Person implements FatherInterface{
	public static String fatherStaticField = "父类静态变量";//6
	public String fatherField = "父类变量";//21
	static {
		System.out.println(fatherStaticField);//7
		System.out.println("父类静态初始化块");//8
	}
	{
		System.out.println(fatherField);//22
		System.out.println("父类初始化块");//23
	}
	public Father() {//14
		System.out.println("父类构造器");//24
	}
	public void abstractPersonPrint() {
		System.out.println("抽象人类抽象方法在子类中实现");
	}
	public void fatherPrint() {
		System.out.println(fatherInterfaceField);
	}
}
interface ChildInterface{
	public static final String childInterfaceField = "子类接口常量";
	public void childPrint();
}
class Child extends Father implements ChildInterface{
	public static String childStaticField = "子类静态变量";//9
	public String childField = "子类变量";//25
	static {
		System.out.println(childStaticField);//10
		System.out.println("子类静态初始化块");//11
	}
	{
		System.out.println(childField);//26
		System.out.println("子类初始化块");//27
	}
	public Child() {//13
		System.out.println("子类构造器");//28
	}
	public void childPrint() {
		System.out.println(childInterfaceField);
	}
}

测试结果:
抽象人类静态变量
抽象人类静态初始化块
父类静态变量
父类静态初始化块
子类静态变量
子类静态初始化块
抽象人类变量
抽象人类初始化块
抽象人类构造器
父类变量
父类初始化块
父类构造器
子类变量
子类初始化块
子类构造器
结果就是:父类静态块 --> 子类静态块 --> 父类自由块 --> 父类构造函数块 --> 子类自由块 --> 子类构造函数 的顺序,因为抽象类继承自Object,父类继承自抽象类,自累积成自父类。
不过知道具体的代码执行顺序了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值