Java中的抽象类和方法,inheritance
我有B类,它inheritance自A类。超类A是抽象的,包含一个抽象方法。 我不想在B类中实现抽象方法,因此我需要将类B声明为抽象。 声明B类抽象,两件事对我有用(程序编译并正确运行):
1.)我没有在B类中声明任何抽象方法,甚至认为该类是抽象的。 我认为这是有效的,因为该类inheritance了类A的抽象方法,这足以使类被声明为抽象:我们不需要在类中直接声明的任何其他抽象方法。
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(); }
问候
在Java中, abstract
类注释表明该类无法直接实例化。 一个类可以被声明为abstract
因为它永远不应该被实例化(也许它只包含静态方法),或者因为它的子类应该被实例化。
并不要求abstract
类包含abstract
方法(反之亦然:包含一个或多个abstract
方法的类必须是abstract
。)
你是否应该复制抽象方法定义的问题可能被认为是一个风格问题 – 但我很难提出一个支持重复定义的论据(我能提出的唯一论据就是这种情况)类层次结构可能会更改语义或方法的使用,因此您希望在类B中提供额外的javadoc。)
反对重新定义abstract
方法的主要论点是重复的代码很糟糕 – 它使重构变得更加繁琐(所有经典的“不重复的代码”参数都适用。)
它们在function上是相同的,但第一个是首选,因为它更短并且不奇怪。
去#1。 重写子类中的方法声明令人困惑。 而且实际上,在抽象类中不需要任何抽象方法,无论父类是否是抽象的。
所以,问题是:在java中对抽象类进行子类化并且不想提供实现时,首选哪个?
a)也将子类标记为抽象
b)将子类标记为抽象并重写标记为抽象的方法签名?
我会选择第一个:
a)将子类标记为抽象。
前者已经有了抽象方法声明,重复它没有意义。
你是对的,这两种情况是等价的。 案例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 { ... }