具有抽象类的静态块的行为

时间:2013-12-12 06:45:09

标签: java abstract-class static-block

儿童班:

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();

    }
}

这为我提供了输出:

父静态执行 ]

执行子静态块

parentAbstract初始化

子const初始化

MethodInParent名为

为什么不是这样?

父静态执行

parentAbstract初始化

执行子静态块

子const初始化

MethodInParent名为

2 个答案:

答案 0 :(得分:8)

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

的输出
 parent static executed
 child static block executed

根据section 12.4.2 of the JLS

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

 parentAbstract initialized
 child const initialized

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

MethodInParent called

我认为你缺少的部分是在构造函数启动之前必须完全初始化类型。构造函数调用无法初始化只是足够的超类来调用其构造函数,然后初始化子类。除了其他任何东西,如果你在超类构造函数中调用getClass(),那必须是一个完全初始化的类 - 它必须是子类,因为那就是对象的一个实例

答案 1 :(得分:2)

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