父类:
public class Parents {
private String param;
public Parents(){
System.out.println("父级-构造函数-无参");
}
public Parents(String param){
this.param = param;
System.out.println("父级-构造函数-有参:"+param);
}
{
System.out.println("父级-构造代码块");
}
static {
System.out.println("父级-代码块-静态");
}
public void getParams(String param){
System.out.println("父级-方法-有参:"+param);
}
}
子类:
public class Sons extends Parents {
private String param;
public Sons(){
System.out.println("子级-构造函数-无参");
}
public Sons(String param){
// super(param);
this.param = param;
System.out.println("子级-构造函数-有参:"+param);
}
{
System.out.println("子级-构造代码块");
}
static{
System.out.println("子级-代码块-静态");
}
@Override
public void getParams(String param){
System.out.println("子级-方法-有参:"+param);
}
public static void main(String[] args) {
Sons sons = new Sons("DroyZhou");
sons.getParams("ZhouDroy");
}
输出结果:
父级-构造代码块-静态
子级-构造代码块-静态
父级-构造代码块
父级-构造函数-无参
子级-构造代码块
子级-构造函数-有参:DroyZhou
子级-方法-有参:ZhouDroy
优先级观察总结:
- 静态代码块执行优先级最高,而父类又高于子类。
java静态代码块,用于初始化类,在虚拟机加载类时就会执行,所以会优先执行,但只执行一次。
- 构造代码块内容优先于构造函数内容执行。
找到编译后的*.class文件查看,会发现所有构造函数第一行都添加了构造代码块的内容。
- 构造函数,父类优先级高于子类。
子类的构造函数中,无参状态下其实第一行默认是super()执行父类构造函数,而有参状态下第一行必须是super(params…)。
- 方法,优先执行子集重写的方法,如果子集未重写则执行父级方法。