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

时间:2011-06-24 01:17:57

标签: java class extend inheritance

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

public class ClassA extends BaseClass {

}

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

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

public class ClassA extends BaseClass {
   @Override
   public void start() {
      super.start();
   }
}

5 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:9)

覆盖方法,执行特殊操作,然后调用super.method()称为装饰方法 - 您添加到行为中。在此处阅读更多内容:Decorator Pattern

在不调用超级方法的情况下覆盖它只是覆盖方法 - 更改行为。

答案 2 :(得分:6)

public class ClassA extends BaseClass {
  @Override
  public void start() {
     super.start();
  }
}

完全一样,完全不像这样覆盖

public class ClassA extends BaseClass {}

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

答案 3 :(得分:1)

当我想在那里设置断点时,我有时会这样做(暂时,在开发期间)。

答案 4 :(得分:0)

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

  • 但是我们需要进行覆盖的一个地方是,比如你已经重载了超类默认构造函数,那么在子类中你需要提到重载的超类构造函数的调用作为你的子类中的第一行构造函数(即必须在创建子类之前创建超类对象)。 例如
  

class BaseClass {

     

基类(ARG1){

     

}

     

}

     

A类扩展了BaseClass {

     

A {       超级(ARG1);      }

     

}

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