4

儿童班:

public class ChildExtending extends ParentAbstract{

    public int childInt =111213;
    static{
        System.out.println("child static block executed");
    }

    public ChildExtending() {
        System.out.println("child const initialized");
    }
    public void MethodInChild(){
        System.out.println("MethodInChild called");
    }
    public static void main(String[] args){
        System.out.println(ParentAbstract.parentInt);
        System.out.println(ChildExtending.parentInt);
    }
}

抽象类:

public abstract class ParentAbstract {
    public static int parentInt=80713; 
    static{
        System.out.println("parent static executed");
        parentInt=9;
    }

    public ParentAbstract(){
        System.out.println("parentAbstract initialized");
    }

    public void MethodInParent(){
        System.out.println("MethodInParent called");
    }

}

主类:

public class MainForCheck {
    public static void main(String[] args){
    /*  ParentAbstract pa = new ParentAbstract(){

        };*/

    /*  ChildExtending ce = new ChildExtending();
        ce.childInt=5;*/

        /*ChildExtending ce = new ChildExtending();
        ce.childInt=5;
        ce.MethodInChild();
        System.out.println("pareny int is"+ce.parentInt);*/


        ChildExtending ce = new ChildExtending();
        ce.MethodInParent();

    }
}

这给了我输出:

父静态执行]

子静态块执行

父抽象初始化

子常量初始化

MethodInParent 调用

为什么不是这样?

父静态执行

父抽象初始化

子静态块执行

子常量初始化

MethodInParent 调用

4

2 回答 2

8

那么首先ChildExtending需要初始化(作为一种类型)。这将产生的输出

 parent static executed
 child static block executed

根据JLS 的第 12.4.2 节

只有在初始化类型后才能调用构造函数,此时您将获得以下输出:

 parentAbstract initialized
 child const initialized

一旦构造了对象,您就可以在其上调用实例方法,输出为:

MethodInParent called

我认为您缺少的部分是必须在构造函数启动之前完全初始化类型。构造函数调用不能初始化足够多的超类来调用它的构造函数,然后初始化子类。除此之外,如果你getClass()在超类构造函数中调用,那必须是一个完全初始化的类——它必须是子类,因为这就是对象实例。

于 2013-12-12T06:50:33.103 回答
2

每当类第一次加载时,它的静态块总是首先执行。所以这里它的父子静态块被执行然后实例块或方法执行

于 2013-12-12T06:50:03.490 回答