java继承中初始化的顺序

java中子类继承了父类,其初始化的顺序是:
首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面的静态代码块里面的内容;当父类的静态代码块里面的内容执行完毕后,接着去执行子类里面的静态代码块,当子类的静态代码块执行完毕后;
它接着又去查看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕后,接着执行父类的构造方法;父类的构造方法执行完毕后,接着去查看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕后再去执行子类的构造方法。


下面是一个例子进行验证:


package com.adu.test;
abstract class BaseParent{
int a =10;
public BaseParent(){
System.out.println("baseparent constructor ...");
}
static {
System.out.println("Base parent static block");
}
{
System.out.println("Base parent non static block");
}
public abstract void show();
}
class Father extends BaseParent{
int a = 11;
public Father(){
System.out.println("Father constructor ....");
}
static {
System.out.println("Father static block");
}
{
System.out.println("Father non static block ");
}
public void show(){
System.out.println("Father show ...");
}
}
class Child extends Father {
int a =12;
public Child(){
System.out.println("CHild constructor ...");
}
static {
System.out.println("Child static block");
}
{
System.out.println("Child non static block ");
}
public void show(){
System.out.println("Child show ...");
}
}
public class TestExtends {

public static void main(String[] args) {
// TODO Auto-generated method stub
Father father  = new Child();
father.show();
}


}


这里输出是:
Base parent static block
Father static上 block
Child static block
Base parent non static block
baseparent constructor ...
Father non static block 
Father constructor ....
Child non static block 
CHild constructor ...
Child show ...
验证了结论。

main方法里面创建了子类child对象,并将引用返回给了父类,此时再调用重写的方法时,是调用的子类中的对应的方法。


该内容是这两天笔试中的一个题目,当时只记得先执行父类的构造方法,然后再是子类的构造方法。至于静态的程序块,则不确定其顺序,只知道他是在程序加载的时候静态的块就会被执行,因此想静态块肯定是在最前面,然后笔试的那道题应该是猜对了。但是这里还有非静态块的程序,到底是在什么顺序下执行?

经测试,静态块程序执行完毕后,是父类的非静态块,在是父类构造方法;然后是子类的非静态块,再者是子类的构造方法。这样的顺序,学习中啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值