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 { ... }