Java—扩展类并重用方法?
在下面的代码中,我想使用start()方法,因为它是在super类中定义的,我在很多其他开发人员的代码中看到,他们重写了super类中的方法,然后调用super。这有什么原因吗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();
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方法的情况下重写它只是重写一个方法-更改行为。当我想在那里设置断点时,我有时会这样做(暂时,在开发过程中) 继承概念背后的主要原因是子类中常见的函数或操作的泛化。只有当我们需要为特定的子类定制操作时,重写才有意义
- 但是我们确实需要进行重写的一个地方是,假设您重载了您的超类默认构造函数,那么在子类中,您需要提到重载的超类构造函数的调用,作为子类构造函数的第一行(即,必须在创建子类之前创建超类对象)。 比如说
在其他地方,它只会增加代码的冗余,这根本不是必需的+1它是冗余和混乱的。如果您看到该方法被重写(IDE将向您显示该方法,即使您看不到源代码),您可能会认为它还做了一些其他事情,而不是继承的默认值。另外,如果你重写了这个方法,应该有Javadoc来支持它。@Thilo:我个人觉得它不够清晰,也没有在我的团队中实践过。争论的焦点是Java新手没有查看超类的习惯。(不使用三元运算符的理由也是一样。)我不喜欢过分适应非Java开发人员的东西。一个人应该学习他正在学习的语言的惯例和习惯用语。@Jeanne Boyarsky,没错!这是每个开发人员的偏好问题,通常您的文档应该足够好,您不需要这样做,但更清晰总是比不清晰好。@javaguy:然后它也会打断超级类实例。
public class ClassA extends BaseClass {
@Override
public void start() {
super.start();
}
}