在子类的方法中本地调用超类方法时使用 "super" 关键字或使用超类实例?

Using "super" keyword or using a superclass instance when calling superclass methods locally in a method from subclass?

假设我有:

class Superclass {
  //fields...

  methodA() {...}

  methodB() {...}

...
}

class Subclass extends Superclass {
   //fields...

   methodA() {
      // Here I need to call methods A and B from superclass:
      // For this, I can use supper
      super.methodA();
      super.methodB();

      // Or I have to instantiate the superclass and use the instance
      Superclass superclass = new Superclass();
      superclass.methodA();
      superclass.methodB();
}

两种方式都有效,但我想知道哪种更好用。这些方法中的任何一种都是糟糕的编程技术?希望大家给我答案和论据。

  super.methodA();

  Superclass superclass = new Superclass();
  superclass.methodA();

这两个methodA的调用作用于不同的实例,所以是完全不同的。 super.methodA() 在当前实例上执行 methodAsuperclass.methodA() 在与当前实例无关的 Superclass 的新实例上执行 methodA

您几乎总是会使用第一个选项。至于第二个选项,创建一个新实例,在该实例上调用一个方法,然后再也不对该实例做任何事情是没有意义的。

It works both ways, but I want to know which is better to use.

嗯,这完全取决于您要实现的目标。如果您想要 创建一个新的、完全独立的实例,请这样做。但是更常见的是,您想在覆盖方法当前正在执行的同一实例上使用要覆盖的方法的超类实现 在这种情况下,您将使用 super.methodA().

根据我的经验,super 最常用于覆盖方法以执行某些特定于子类的工作,调用超类实现,然后执行更多特定于超类的工作。例如:

@Override public void add(Foo foo) {
    doSomeSubclassSpecificValidation(foo);
    super.add(foo);
    doSomeSubclassSpecificBookKeeping();
}

换句话说,即使您重写了该方法,您仍然需要 "normal" 行为 - 您只需要一些额外的代码来 运行。或者有时你想有条件地 运行 超类代码,例如仅当输入满足特定条件时。

完全不一样

super.methodA() 将在左圆中调用 methodA(),同时创建一个新的超类并调用该 methodA() 将首先创建右圆,然后从中调用方法。

通过以上回答,您一定已经明白,基本上您是在调用相同 class 的相同方法,但在两个不同的对象上,所以这完全取决于您要实现的目标(您计划在哪个对象上调用那些方法)。如您所知,调用相同 class 但在不同实例上的相同方法是不一样的。 "super" 对象是 "this" 对象的父对象,并且当您实例化 Subclass 时隐式创建了该超级对象,因此根据您的示例代码,两者都是 不相同 但对于简单的情况,输出可能是相同的。更上一层楼,看看它看起来是否与客户端代码不同(尝试编写 Subclass 的调用代码)。