【问题标题】:Invoking a super class method from a super class constructor [duplicate]从超类构造函数调用超类方法[重复]
【发布时间】:2014-02-17 19:32:16
【问题描述】:

我有一个关于以下代码 sn-p 的非常简单的问题。

public class SuperClass {

    public SuperClass() {
        this.test();  //Always invokes the overridden method in the sub-class.
    }

    public void test() {
        System.out.println("test() in SuperClass.");
    }
}

public final class SubClass extends SuperClass {

    public SubClass() {
        super();        
    }

    @Override
    public void test() {        
        System.out.println("test() in SubClass.");
    }
}

public final class Test {

    public static void main(String... args) {
        SubClass subClass=new SubClass();
    }
}

在此示例中,main() 方法中的唯一一行间接传递了对超类构造函数的调用,在该构造函数中它尝试以this.test() 调用test() 方法。

在超类构造函数中this.test()调用的方法是SubClass中的重写方法。

为什么超类构造函数中的方法调用this.test() 不调用超类本身中的自己的方法(尽管this 指的是当前实例,this 方法将通过该实例被调用)?

【问题讨论】:

  • 因为this 是当前的SubClass 实例。
  • @RohitJain:IMO 这是一个相关但明显不同的问题。
  • @NPE 我同意你的观点。我不应该将其关闭为重复,但该问题包含此问题的答案:)
  • 没有SuperClass实例,只有SubClass实例。
  • @RohitJain:我同意;它确实(但对于这个问题可能有点过于复杂)。 :)

标签: java inheritance


【解决方案1】:

虽然[t] this 指的是要调用此方法的当前实例

确实如此,并且该实例的运行时类型是SubClass,因此会调用SubClass 的方法。

【讨论】:

    【解决方案2】:

    在面向对象的编程中,其中一个想法是对象本身负责它如何操作其数据。因为您调用了SubClass 对象,所以当您在该对象上调用test() 时,可以从任何地方调用SubClass 的test() 方法。 this 关键字引用当前实例,它将引用对象被调用的任何内容。

    【讨论】:

    • 这是一个合乎逻辑的论点,但可能有点过于笼统。例如,在 C++ 中,等效代码将调用超类的 test() 方法。
    • 这很有趣。当我学习 C++ 时,我被教导将任何打算被覆盖的方法标记为虚拟方法,这是我从未真正见过的行为。
    • 令人困惑的是,在 C++ 中,我所描述的会发生在 virtual 方法中:stackoverflow.com/questions/496440/…
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多