Java - 扩展一个类并重用这些方法?

ary*_*axt 11 java inheritance class extend

public class BaseClass {
   public void start() {
      // do something
   }
}

public class ClassA extends BaseClass {

}

ClassA c = new ClassA();
c.start();
Run Code Online (Sandbox Code Playgroud)

在下面的代码中,我想使用在超类中定义的start()方法,我在很多其他开发人员的代码中看到他们覆盖了超类中的方法,然后他们调用了super.这是有原因的吗?

public class ClassA extends BaseClass {
   @Override
   public void start() {
      super.start();
   }
}
Run Code Online (Sandbox Code Playgroud)

Jea*_*sky 11

明晰?一些开发人员认为在子类中显示该方法更为清晰.我不同意.这是多余的信息.

至少从Java 5开始,您可以添加@Override,以便编译器告诉您签名是否更改/消失.

除了构造函数.对于构造函数,您确实必须使用相同的签名创建自己的签名并向上委派.在这种情况下,省略不等同于.

  • +1这是多余和令人困惑的.如果您看到该方法被覆盖(IDE将向您显示,即使您看不到源代码),您也会认为它还会继承默认值.此外,如果您重写该方法,它应该有Javadoc. (2认同)

Boh*_*ian 9

覆盖方法,做一些特殊的事情,然后调用super.method()称为装饰方法 - 你要添加到行为中.在这里阅读更多:装饰模式.

在不调用super方法的情况下覆盖它只是覆盖一个方法 - 改变行为.


Bal*_*a R 6

public class ClassA extends BaseClass {
  @Override
  public void start() {
     super.start();
  }
}
Run Code Online (Sandbox Code Playgroud)

完全相同的事情,就像这样完全没有压倒一切

public class ClassA extends BaseClass {}

所以,除非你有一些额外的功能要添加(在这种情况下你调用超类的方法,然后添加你的额外逻辑)或做一些不同的事情(你不要调用超类的方法,只是定义一些不同的逻辑),最好你不要覆盖超类的方法(并调用超类的方法)因为它没有意义.