我有B类,它继承自A类。超类A是抽象的,包含一个抽象方法。我不想在B类中实现抽象方法,因此我需要将类B声明为抽象。声明B类抽象,有两件事对我有用(程序编译并正确运行):
1。)我没有在B类中声明任何抽象方法,甚至认为该类是抽象的。我认为这是有效的,因为该类继承了A类的抽象方法,这足以将该类声明为abstract:我们不需要在类中直接声明任何其他抽象方法。
2。)我在类B中声明了与在类A中声明的相同的抽象方法。这是某种重写(?),与在java中重写(使用相同的头,但是提供不同的实现),这里我再次使用该方法的相同标题。
这两件事都有效,我不确定它们是否都好,以及其中一些是否优先(更正确)。两种方式是否相同(它们对Java是否相同)?
这里我给出一些示例类,所以我的意思对你来说更清楚:
案例1。):
public abstract class A {
public abstract String giveSum();
}
public abstract class B extends A {
}
案例2。):
public abstract class A {
public abstract String giveSum();
}
public abstract class B extends A {
public abstract String giveSum();
}
此致
答案 0 :(得分:35)
在Java中,abstract
类注释表示无法直接实例化该类。一个类可以声明为abstract
,因为它永远不应该被实例化(也许它只包含静态方法),或者因为它的子类应该被实例化。
不要求abstract
类包含abstract
方法(逆 为真:包含一个或多个{{ 1}}方法必须是abstract
。)
是否应该复制抽象方法定义的问题可能会被视为一种风格问题 - 但我很难提出一个支持重复定义的论据(我能提出的唯一论据是在类层次结构可能会改变语法或使用方法的情况下,因此您希望在B类中提供额外的javadoc。)
反对重新定义abstract
方法的主要论点是重复代码很糟糕 - 它使重构变得更加繁琐(所有经典的“不重复代码”参数都适用。)
答案 1 :(得分:8)
它们功能相同,但第一个是首选,因为它更短,并不奇怪。
答案 2 :(得分:2)
使用#1。重写子类中的方法声明令人困惑。而且你实际上在抽象类中不需要任何抽象方法,无论父类是否是抽象的。
答案 3 :(得分:2)
所以,问题是:在java中对抽象类进行子类化并且不想提供实现时,首选哪个?
a)将子类标记为抽象
b)将子类标记为抽象并重新编写标记为抽象的方法签名?
我会选择第一个:
a)将子类标记为抽象。
前者已经有了抽象方法声明,重复它没有意义。
答案 4 :(得分:1)
你是对的,这两种情况是等价的。案例1)更简单,案例2)是代码重复 - 避免它。但可能有一个原因可以这样做:
如果A类中的方法没有返回String
但是让C说,B类可能会覆盖它(因为Java 5)具有更具体的返回类型,让我们说D(类扩展C):
public abstract class A {
public abstract C giveSum();
}
public abstract class B extends A {
public abstract D giveSum();
}
public class C {
...
}
public class D extends C {
...
}