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();
}
}
答案 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); }
}
在其他地方,它只会添加代码的冗余,这根本不是必需的