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

hid*_*ame 3 java inheritance

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

chr*_*her 7

想到一个用例..

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

public abstract class Animal {
    // Some stuff.
}
Run Code Online (Sandbox Code Playgroud)

然后你说,好吧,现在我想Giraffe上课.Giraffe是具体的,所以没有必abstract要这样做..

public class Giraffe {
    // Some stuff that overrides or uses the Animal behaviour.
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以你会怎么做?

你采取后一种选择..

public abstract class StripyGiraffe extends Giraffe
Run Code Online (Sandbox Code Playgroud)

你可以继续扩展它..

public class AfricanStripyGiraffe extends StripyGiraffe
Run Code Online (Sandbox Code Playgroud)

这样,旧代码可以毫无障碍地工作,并且您仍然非常欢迎尽可能扩展对象层次结构.您可以通过将对象声明为abstract不具有足够的特定性来实现对象的完整性,并使用此方法允许用户仍然进行声明.

Giraffe geoffrey = new AfricanStripyGiraffe();
Run Code Online (Sandbox Code Playgroud)