Java从基构造函数调用基方法

Java从基构造函数调用基方法,java,inheritance,Java,Inheritance,如何从Super::Super()调用Super::printThree? 在下面的示例中,我改为调用Test::printThree class Super { Super() { printThree(); // I want Super::printThree here! } void printThree() { System.out.println("three"); } } class Test extends Sup

如何从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()

你不能-它是一个在子类中被重写的方法;不能强制执行非虚拟方法调用。如果要非虚拟地调用方法,请将该方法设为私有或最终


一般来说,在构造函数中调用非final方法是一个坏主意,因为正是这个原因-子类构造函数体还没有执行,所以您实际上是在一个尚未完全初始化的环境中调用方法。

您违反了动态调度和继承背后的整个思想。只是不要这样做(无论如何,在java中很难规避)。相反,将函数设为private和/或final,这样它就不会在继承的类中被覆盖

如果
Super
需要确保
printThree()
未被覆盖,则需要将该方法声明为
final
。或者,
Test
中的重写方法可以决定调用被重写的方法,如果它选择:

@Override
void printThree() { super.printThree(); }

如果基类没有将一个方法标记为
final
,那么它就放弃了不让派生类重写它并按照它们的意愿去做的权利。

除了他不想在继承类中调用超级方法,而是相反。所以使用
super
的想法显然行不通,因为他的超类的super是Object。@Voo-同意,我只是指出可能的场景。他想要什么是不可能的。