为什么具体类的子类可以声明为abstract,而某些父类方法可以被重写并声明为abstract?

时间:2014-06-16 15:42:35

标签: java inheritance

通常我们声明抽象类的子类是具体的,并将抽象方法覆盖为具体的。是否存在相反的用途?

2 个答案:

答案 0 :(得分:7)

想到一个用例..

想象一下,你有一个课程如下..

public abstract class Animal {
    // Some stuff.
}

然后你说,好吧,现在我想要一个Giraffe课程。 Giraffe具体,因此无需进行abstract ..

public class Giraffe {
    // Some stuff that overrides or uses the Animal behaviour.
}

现在给它一些时间,当你有六到七个使用你的代码的应用程序时。

然后,有一天,当你感到无聊时,你决定在维基百科上查找长颈鹿,你发现事实上,Giraffe非常模糊!在那里发现了长颈鹿,条纹长颈鹿,长腿长颈鹿......所有这些都出现在不同的国家!那你做什么?

  • 您可以将Giraffe更改为abstract类,并将extend更改为子类..但您已经有很多应用程序使用您的代码。您是否立即将它们废弃并强制进行大规模更新?
  • 您可以创建更多类来描述更具体的Giraffe形式,但是...... StripyGiraffe还不够具体......除非您可以创建该类abstract ..

那你做什么?

你选择后一种选择..

public abstract class StripyGiraffe extends Giraffe

你可以继续扩展它..

public class AfricanStripyGiraffe extends StripyGiraffe

这样,旧代码可以顺利运行,并且您仍然非常欢迎尽可能扩展对象层次结构。您可以通过将对象声明为abstract来确定对象的完整性,因为它们不够具体,无法实现,并且使用此方法可以让用户仍然处于状态。

Giraffe geoffrey = new AfricanStripyGiraffe();

答案 1 :(得分:-1)

在Java中,每个类都派生自Object类型。当你创建一个抽象类表单具体类时,这就是一种答案。您只是声明实现不完整,应该在较低的抽象层上详细说明。