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

Java 具有抽象类的静态块的行为,java,abstract-class,static-block,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 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在类第一次加载时调用,它的静态块总是首先执行。因此,在这里执行其父级和子级的静态块,然后实例块或方法执行

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

 parent static executed
 child static block executed
根据

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

 parentAbstract initialized
 child const initialized
MethodInParent called
一旦构建了对象,就可以对其调用实例方法,输出为:

 parentAbstract initialized
 child const initialized
MethodInParent called
我认为您缺少的一点是,必须在构造函数启动之前完全初始化类型。构造函数调用无法初始化足够的超类来调用其构造函数,然后初始化子类。除此之外,如果在超类构造函数中调用
getClass()
,则必须是一个完全初始化的类,它必须是子类,因为对象就是子类的实例