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

时间:2015-06-30 05:57:54

标签: java inheritance instance subclass superclass

我想说:

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();
}

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

4 个答案:

答案 0 :(得分:1)

  super.methodA();

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

methodA的这两个调用适用于不同的实例,因此它们完全不同。 super.methodA()在当前实例上执行methodAsuperclass.methodA()methodA的新实例上执行Superclass,该实例与当前实例无关。

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

答案 1 :(得分:1)

  

它有两种方式,但我想知道哪种方法更好用。

那完全取决于你想要实现的目标。如果您想要创建一个完全独立的新实例,请执行此操作。但是,更常见的是,您希望使用一个方法的超类实现,该方法将覆盖当前正在执行重写方法的同一实例,在这种情况下,您将使用super.methodA()

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

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

换句话说,即使你重写了这个方法,你仍然需要“正常”的行为 - 你只需要一些额外的代码来运行。或者有时您希望有条件地运行超类代码,例如只有输入符合某个标准。

答案 2 :(得分:1)

  

它完全不同。

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

答案 3 :(得分:0)

通过上面的答案,您必须明白,基本上您在同一个类中调用相同的方法,但在两个不同的对象上,所以这一切都取决于您要实现的目标(您打算在哪个对象上调用这些方法)。如您所知,调用相同类的相同方法但在不同实例上不一样。 “super”对象是“this”对象的父级,并且在实例化Subclass时隐式创建了超级对象,因此根据您的示例代码,两者都是 NOT SAME ,但对于简单情况,输出可能相同。再向上一级,看看它与客户端代码有什么不同(尝试编写Subclass的调用代码)。