面试题中常常遇见子类继承父类,new一个子类对象,请写出执行顺序,着实恶心.
写个小小demo,来理解一下.
public class Parent {
public int publicPro;
private int privatePro;
protected int protectedPro;
static {
System.out.println(" static block 1 parent");
}
static {
System.out.println("static block 2 parent");
}
{
System.out.println("block parent");
}
public void publicMeth(){
System.out.println("public method parent");
}
private void privateMeth(){
System.out.println("private method parent");
}
protected void protectedMeth(){
System.out.println("protected method parent");
}
public Parent(){
System.out.println("constructor parent");
}
}
public class Son extends Parent {
static {
System.out.println(" static block 1 son");
}
static {
System.out.println("static block 2 son");
}
{
System.out.println("block son");
}
public Son(){
// super();//调用super() 必须在子类构造方法函数第一行
System.out.println("constructor son");
}
public static void main(String[] args) {
Son son=new Son();
System.out.println("--------分割线---------");
son=new Son();
}
}
输出结果:
规律:
- 同一个类中,静态块执行顺序与其自然顺序(代码顺序)一致
- 静态块只执行一次
- 代码块是创建一次对象执行一次
- 顺序:父类静态块->子类静态块->父类代码块->父类构造->子类代码块->子类构造,即:同一个类中:静态块>代码块->构造
另外面试题中会遇到的:
super() 如果显式在子类构造方法中使用时,必须放在方法体第一行
super. 可以获取父类除private修饰之外的所有属性与方法(需要注意default只是同package可见)