10

我有类 B,它继承自类 A。超类 A 是抽象的,包含一个抽象方法。我不想在 B 类中实现抽象方法,因此我也需要将 B 类声明为抽象。声明 B 类抽象,有两件事对我有用(程序编译和运行正确):

1.)我没有在B类中声明任何抽象方法,即使该类是抽象的。我认为这是可行的,因为该类继承了类 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();
}

问候

4

5 回答 5

35

在Java中,abstract类注解表示该类不能直接实例化。可以简单地声明一个类,abstract因为它永远不应该被实例化(也许它只包含静态方法),或者因为它的子类应该被实例化。

不要求类包含方法(反之亦然包含一个或多个方法的类必须是.)abstractabstractabstractabstract

是否应该复制抽象方法定义的问题可能被视为一个风格问题 - 但我很难提出一个支持复制定义的论点(我能提出的唯一论点是在这种情况下)其中类层次结构可能会改变语义或方法的使用,因此您希望在 B 类中提供额外的 javadoc。)

反对重新定义该abstract方法的主要论点是重复代码是不好的——它使重构更加麻烦等等(所有经典的“不要重复代码”论点都适用。)

于 2009-01-06T18:34:29.910 回答
8

它们在功能上是相同的,但首选第一个,因为它更短且不奇怪。

于 2009-01-06T18:20:33.980 回答
2

选择#1。在子类中重写方法声明是令人困惑的。而且你实际上不需要抽象类中的任何抽象方法,无论父类是否是抽象的。

于 2009-01-06T18:21:30.107 回答
2

所以,问题是:在java中对抽象类进行子类化并且不想提供实现时,哪个是首选?

a) 也将子类标记为抽象

b)也将子类标记为抽象并重新编写标记为抽象的方法签名?

我会选择第一个:

a) 也将子类标记为抽象。

前者已经有抽象方法声明,重复没有意义。

于 2009-01-06T18:22:55.377 回答
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 {
  ...
}
于 2009-01-06T19:29:28.037 回答