java中父与子类中静态代码块、构造代码块、构造方法的加载顺序

note:
只涉及到静态代码块、构造代码块、构造方法的加载顺序。

父类和子类的代码如下: 		
	
	//父类
	public class A{
		static{
			System.out.println("A静态代码块");
		}
		{
			System.out.println("A构造代码块");
		}
		A(){
			System.out.println("A构造方法");
		}
		
	}

    //子类
    public class C extends A{
		static{
			System.out.println("C静态代码块");
		}
		{
			System.out.println("C构造代码块");
		}
		C(){
			System.out.println("C构造方法");
		}
    }

1、入口在父类A中

第一种情况:
A类创建空main入口
运行结果:
A静态代码块
结果分析
入口在A类内,没有继承父类,只加载A类。

第二种情况:
A类main方法内创建A对象;
A a = new A();
运行结果:
A静态代码块
A构造代码块
A构造方法
结果分析:
构造代码块优先于构造方法执行;
首先加载A类静态代码块,main中创建A对象,执行A的构造代码块,在执行A的构造方法。

第三种情况:
A类main方法内创建A对象和C对象;
A a = new A();
C c = new C();
运行结果:
A静态代码块
A构造代码块
A构造方法
C静态代码块
A构造代码块
A构造方法
C构造代码块
C构造方法
结果分析:
先加载A对象,在创建C对象,执行C静态代码块,C类继承了父类,先加载父类构造代码块和构造方法,在加载本类的构造代码块和构造方法。

第四种情况
A类main方法内创建C对象和A对象;
C c = new C();
A a = new A();
运行结果:
A静态代码块
C静态代码块
A构造代码块
A构造方法
C构造代码块
C构造方法
A构造代码块
A构造方法
结果分析:
入口在A类,加载A类静态代码块,创建C类对象,加载C类静态代码块,C继承A,执行A的构造代码块和A的构造方法,在执行C的构造代码块和构造方法。创建A类对象,A静态代码块只执行一次,执行A本类的构造代码块和构造方法。

第五种情况:
A类定义静态变量:
public static int a = 10;
main方法内输出a变量。
System.out.println("a = "+A.a);
运行结果:
A静态代码块
a = 10
结果分析:
A本类输出静态变量
第六种情况
C类定义静态变量:
public static int c = 10;
main方法内输出c变量。
System.out.println("c = "+C.c);
运行结果:
A静态代码块
C静态代码块
c = 10
结果分析:
加载A在加载C静态代码块,输出静态变量。

2、入口在子类C中

第一种情况:
C类创建空main入口
运行结果:
A静态代码块
C静态代码块
结果分析:
入口在C类内,父类是A类,先加载A类静态代码块在,加载C类。

第二种情况:特别注意
C类main方法内创建A对象;
C a = new C();
运行结果:
A静态代码块
C静态代码块
A构造代码块
A构造方法
C构造代码块
C构造方法
结果分析:
构造代码块优先于构造方法执行;
首先加载A类的在加载C类静态代码块,main中创建C对象,先执行父类A的构造代码块和构造方法,在执行C的构造代码块和构造方法。
第三种情况:
C类main方法内创建C对象和A对象;
C c = new C();
A a = new A();
运行结果:
A静态代码块
C静态代码块
A构造代码块
A构造方法
C构造代码块
C构造方法
A构造代码块
A构造方法
结果分析:
首先加载A类的在加载C类静态代码块,main中创建C对象,先执行父类A的构造代码块和构造方法,在执行C的构造代码块和构造方法。在创建A对象加载A的构造代码块和构造方法。

第四种情况:特别注意
C类main方法内创建A对象和C对象;
A a = new A();
C c = new C();
运行结果:
A静态代码块
C静态代码块
A构造代码块
A构造方法
A构造代码块
A构造方法
C构造代码块
C构造方法
结果分析:
入口在C类,继承A类,加载A类静态代码块,在加载C类静态,创建A类对象,执行A本类的构造代码块和构造方法。,执行A类的构造代码块和构造方法,在创建C的对象,先执行父类A类的构造代码块和构造方法,在执行C本类的构造代码块和构造方法。

第五种情况:
C类定义静态变量:
public static int c = 10;
main方法内输出c变量。
System.out.println("c = "+C.c);
运行结果:
A静态代码块
C静态代码块
c = 10
结果分析:
加载A在加载C静态代码块,输出静态变量。
第六种情况:
A类定义静态变量:
public static int a = 10;
main方法内输出c变量。
System.out.println("a = "+A.a);
运行结果:
A静态代码块
C静态代码块
a = 10
结果分析:
加载A在加载C静态代码块,输出静态变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值