Java子父类加载顺序

Java子父类加载顺序

程序

/** 
 * @ClassName: B 
 * @Description: 父类,测试java继承时,构造器、静态代码块、非静态代码块的执行顺序。
 */
public class B {
    
    
    public B(){
    
    
        System.out.println("this is B's constructor!");
    }

    static{
    
    
        System.out.println("this is B's static block!");
    }

    {
    
    
        System.out.println("this is B' static not block!");
    }

}
/** 
 * @ClassName: A 
 * @Description: 子类,测试java继承时,构造器、静态代码块、非静态代码块的执行顺序。
 */
public class A extends B{
    
    
    /** 
     * @Title:A
     * @Description:构造器  
     */
    public A(){
    
    
        System.out.println("this is A's constructor!");
    }

    static{
    
    
        System.out.println("this is A's static block!");
    }

    {
    
    
        System.out.println("this is A' static not block!");
    }

}
/** 
 * @ClassName: Main 
 * @Description: 测试类,测试java继承时,构造器、静态代码块、非静态代码块的执行顺序。<br>
 * 结论:this is B's static block!<br>
         this is A's static block!<br>
         this is B' static not block!<br>
         this is B's constructor!<br>
         this is A' static not block!<br>
         this is A's constructor!<br>
 */
public class Main {
    
    
    public static void main(String[] args) {
    
    
        A a = new A();
    }
}

结果

this is B’s static block!
this is A’s static block!
this is B’ static not block!
this is B’s constructor!
this is A’ static not block!
this is A’s constructor

结论

在java构造对象时,先将本类和本类的父类加载到内存中,在加载的过程中会执行类中的静态代码块,执行的顺序是:父类静态代码块、子类静态代码块

然后才能继续执行程序(内存中必须有这个类才能构造这个类的实体对象嘛)。

在构造本类的实体类之前就需要先调用类中的非静态代码块,然后再执行类的构造函数,来创建一个实体类,执行的顺序是:父类非静态代码块,父类构造函数,子类非静态代码块,子类构造函数

这个顺序的原因是:当new A();执行时,会调用A类的构造方法,但是A类有父类,就会先调用父类的构造方法,又因为父类有非静态代码块,所以就会先执行父类的非静态代码块,然后再执行父类的构造函数,然后才轮到A类,同样的,先执行A类的非静态代码块,再执行构造函数。

猜你喜欢

转载自blog.csdn.net/qq_32727095/article/details/113863852