如何从Super::Super()调用Super::printThree?
在下面的示例中,我调用Test::printThree。
class Super {
Super() {
printThree(); // I want Super::printThree here!
}
void printThree() { System.out.println("three"); }
}
class Test extends Super {
int three = 3
public static void main(String[] args) {
Test t = new Test();
t.printThree();
}
void printThree() { System.out.println(three); }
}
output:
0 //Test::printThree from Super::Super()
3 //Test::printThree from t.printThree()发布于 2011-08-29 03:46:12
你不能-它是一个在子类中被重写的方法;你不能强制非虚方法调用。如果您希望以非虚拟方式调用方法,请将该方法设置为私有或最终方法。
一般来说,在构造函数中调用非final方法并不是一个好主意,因为这个原因--子类构造函数主体还没有被执行,所以你实际上是在一个还没有完全初始化的环境中调用一个方法。
发布于 2011-08-29 03:48:09
在这里,您违反了动态调度和继承背后的整个思想。不要这样做(而且在java中也很难绕过它)。相反,将函数设为私有和/或最终的,这样它就不会在继承的类中被覆盖
发布于 2011-08-29 03:48:41
如果Super需要确保printThree()不被覆盖,则需要将该方法声明为final。或者,Test中的覆盖方法可以决定调用覆盖的方法,如果它选择:
@Override
void printThree() { super.printThree(); }如果基类没有将一个方法标记为final,它就放弃了不让派生类覆盖它的权利,并随心所欲地做。
https://stackoverflow.com/questions/7223435
复制相似问题