当我们从抽象类的构造函数调用抽象类的抽象方法时,它返回null。为什么?
abstract class OverloadStaticMethod {
OverloadStaticMethod(){
doSubStuff();
}
abstract void doSubStuff();
public static void main(String args[]) {
new ParentClass();
}
}
public class ParentClass extends OverloadStaticMethod {
String s = "Hello world";
void doSubStuff() {
System.out.println(s);
}
}
输出:
null
1条答案
按热度按时间o4hqfura1#
图像字段定义如下:
这应该清楚地表明,用于字段的初始化表达式只是代码,代码需要在某个时刻执行。
"Hello World"
似乎是一个不变的表达,但它不计算在这里(有规则;特别是,必须使s为static和final,才能将其计为常量)。简单的解释是
"Hello World"
到变量s
尚未执行,因为执行按相反顺序运行。当你有class GrandParent
,class Parent extends GrandParent
以及class Child extends Parent
,执行为:首先,祖父母的初始化表达式和初始值设定项。
然后,爷爷奶奶的构装师。
然后,父级的初始化表达式和初始值设定项。
然后,父级的构造函数。
然后,孩子的初始化表达式和初始值设定项。
然后,孩子的构造器。
一般的解决方法是永远不要在任何构造函数中调用可重写的方法。如果你想把“substuff”作为一个概念,引入一个
init()
方法(通常构造函数除了对参数进行一些验证并存储它们之外不应该做太多的工作,这是为什么这是常规样式建议的许多原因之一),或者可能将subsufff的结果作为参数传递给父类的构造函数。注意:“重载静态方法”在java中是不可能的。静态方法根本不参与动态调度,“重载”作为一个概念应用于动态调度。就像说你能尝到绿色的味道-这是没有意义的。