Java—扩展类并重用方法?

Java—扩展类并重用方法?,java,class,extend,inheritance,Java,Class,Extend,Inheritance,在下面的代码中,我想使用start()方法,因为它是在super类中定义的,我在很多其他开发人员的代码中看到,他们重写了super类中的方法,然后调用super。这有什么原因吗 public class BaseClass { public void start() { // do something } } public class ClassA extends BaseClass { } ClassA c = new ClassA(); c.start();

在下面的代码中,我想使用start()方法,因为它是在super类中定义的,我在很多其他开发人员的代码中看到,他们重写了super类中的方法,然后调用super。这有什么原因吗

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

public class ClassA extends BaseClass {

}

ClassA c = new ClassA();
c.start();

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

至少从Java5开始,您可以添加一个@Override,这样编译器就会告诉您签名是否更改/消失

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

public class ClassA extends BaseClass {
   @Override
   public void start() {
      super.start();
   }
}
这样做与完全不重写完全相同

公共类ClassA扩展了基类{}


所以,除非您有一些额外的功能要添加(在这种情况下,您调用了super类的方法,然后添加了额外的逻辑)或要做一些不同的事情(您不调用super类的方法,只定义一些不同的逻辑),否则最好不要覆盖super类的方法(并调用super类的方法)因为这是毫无意义的。

重写一个方法,做一些特殊的事情,然后调用
super.method()
被称为装饰一个方法-您正在添加行为。请在此处阅读更多:


在不调用super方法的情况下重写它只是重写一个方法-更改行为。

当我想在那里设置断点时,我有时会这样做(暂时,在开发过程中)

继承概念背后的主要原因是子类中常见的函数或操作的泛化。只有当我们需要为特定的子类定制操作时,重写才有意义

  • 但是我们确实需要进行重写的一个地方是,假设您重载了您的超类默认构造函数,那么在子类中,您需要提到重载的超类构造函数的调用,作为子类构造函数的第一行(即,必须在创建子类之前创建超类对象)。 比如说
类基类{

基类(arg1){

}

}

类扩展了基类{

A{ 超级(arg1); }

}


在其他地方,它只会增加代码的冗余,这根本不是必需的

+1它是冗余和混乱的。如果您看到该方法被重写(IDE将向您显示该方法,即使您看不到源代码),您可能会认为它还做了一些其他事情,而不是继承的默认值。另外,如果你重写了这个方法,应该有Javadoc来支持它。@Thilo:我个人觉得它不够清晰,也没有在我的团队中实践过。争论的焦点是Java新手没有查看超类的习惯。(不使用三元运算符的理由也是一样。)我不喜欢过分适应非Java开发人员的东西。一个人应该学习他正在学习的语言的惯例和习惯用语。@Jeanne Boyarsky,没错!这是每个开发人员的偏好问题,通常您的文档应该足够好,您不需要这样做,但更清晰总是比不清晰好。@javaguy:然后它也会打断超级类实例。
public class ClassA extends BaseClass {
  @Override
  public void start() {
     super.start();
  }
}