儿童班:
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名为
答案 0 :(得分:8)
首先需要初始化ChildExtending
(作为一种类型)。这将产生
parent static executed
child static block executed
只有初始化类型后才能调用构造函数,此时你将获得输出:
parentAbstract initialized
child const initialized
一旦构造了对象,就可以在其上调用实例方法,输出为:
MethodInParent called
我认为你缺少的部分是在构造函数启动之前必须完全初始化类型。构造函数调用无法初始化只是足够的超类来调用其构造函数,然后初始化子类。除了其他任何东西,如果你在超类构造函数中调用getClass()
,那必须是一个完全初始化的类 - 它必须是子类,因为那就是对象是的一个实例
答案 1 :(得分:2)
每当类第一次加载时,其静态块总是先执行。所以这里执行它的父和子的静态块然后执行实例块或方法