多重继承和静态成员初始化的顺序

04092812 发布于 2017/11/21 20:31
阅读 91
收藏 0


public class Test3 {
public static void main(String[] args) {
new C();
}

}
class A{
    static B b=new B(1);
    A(){
        System.out.println("A的构造方法");
    }
    A(int i){System.out.println("A的有参构造");}
         void show(){
        System.out.println("A");
    }
}
class B extends A{
    int a=1;
    static C c=new C(1);
    B(){ System.out.println("B的构造方法");}
    B(int i){System.out.println("B的有参构造");}
    void 
    show(){}

}
class C extends B {
C(){
    System.out.println("C的构造方法");

}
C(int i){System.out.println("C的有参构造");}
}
 

加载中
0
tcxu
tcxu

多重继承和静态成员初始化的顺序归纳如下:

  1. 静态代码块(静态属性和方法)在JVM加载类的时候执行,且仅执行一次。执行时,父类优先于子类执行。所以,静态属性和方法是被最先搞定的。
  2. 静态代码块被搞定之后,再来依次解决构造方法的调用。
  3. 执行任何一个类的构造方法时,无论第一行有没有调用其父类构造方法得代码,都必须先调用 父类的构造方法(先有父亲,后有孩子), 再执行子类构方法 。如果是多级继承关系的话,高层的父类首先执行。

 因此,执行Test3 的主方法时,为了调用C类的无参构造方法 new C() ,必须;

  1. 先搞定有关类的静态属性:  A 类的static B b 和 B 类的 static C c.
  2. 然后,才得以执行C 类的默认构造方法    C()        

按运行此程序的输出,解释根据上述原则,完成任务的顺序, 如下:

运行此代码的输出

任务完成情况说明

A的构造方法

调用 B(1) 时,首先要调用B的父类的构造方法 A()
B的有参构造

以完成B(1)的调用(static B  b = new B(1);),

从而为类 A创建 一个静态属性 B b

A的构造方法

调用 C(1) 时,首先要调用最高层的父类A的构造方法 A()
B的构造方法 其次再调用C的直接父类B的构造方法B()
C的有参构造

最终,才得以完成C类自己的有参数的构造方法

static C c=new C(1); 的调用,

为类 B创建 一个静态属性 C c

A的构造方法

继JVM完成静态属性的创建之后,才来调用C的默认的

(无参数的)构造方法C()。

此刻,必须先调用 父类的构造方法,

如果是多级继承关系的话,高层的父类首先执行。

故,首先调用最高层的类A的构造方法 A()

B的构造方法 然后,调用 C 的直接父类 B 的构造方法B()
C的构造方法

最终,按 Test3类主方法的安排,

才得以完成C类自己的无参的构造方法 new C(); 的调用

参考 static和constructor的执行顺序(福建新大陆笔试)

返回顶部
顶部