为什么必须在任何子类方法的代码之前调用超类的方法版本?

Lee*_*ood 3 java inheritance

我是出于好奇而不是必然而已.我想答案就像是"因为这就是Java的构建方式".我想知道为什么选择这种方式.

例如,如果我的超类有这个方法:

public void foo()
{
   System.out.println("We're in the superclass.");
}
Run Code Online (Sandbox Code Playgroud)

并且子类重写该方法:

@Override
public void foo()
{
   super.foo();
   System.out.println("We're in the subclass.");
}
Run Code Online (Sandbox Code Playgroud)

为什么需要super.foo()在子类的方法的顶部(如果它将被使用)?为什么我不能交换这两行来使它看起来像这样:

@Override
public void foo()
{
   System.out.println("We're in the subclass.");
   super.foo();
}
Run Code Online (Sandbox Code Playgroud)

tdd*_*key 7

它没有.它适用于构造函数,但对于普通方法,您可以随时调用它.如果你不想,你甚至不必调用它,或者你可以完全调用不同的父类方法.

从你的例子:

public static void main(String[] args) {
    new B().foo();
}

static class A {
    public void foo() {
        System.out.println("In A");
    }
}

static class B extends A {
    public void foo() {
        System.out.println("In B");
        super.foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

In B
In A
Run Code Online (Sandbox Code Playgroud)