首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要扩展抽象类来更改函数定义,而我可以简单地使用重写方法?

为什么要扩展抽象类来更改函数定义,而我可以简单地使用重写方法?
EN

Stack Overflow用户
提问于 2017-07-28 23:39:52
回答 2查看 771关注 0票数 1

假设我有一个动物类,我想为每种动物提供不同的类和功能。有两种方法可以这样做:

  1. 通过继承重写的方法: 公共类动物{公共空音() {}公共类狗扩展动物{公共空音(){System.out.println(“树皮”);}公共静态空洞主(String[] args) {String[]狗=新狗();dog.sound();}
  2. 通过扩展Animal抽象类: 抽象公共类动物{抽象公共虚音();}公共类狗扩展动物{公共空音(){System.out.println(“树皮”);}公共静态空音主(String[] args) {String[]狗=新狗();dog.sound();}

那么,为什么我们要使用抽象类,而第一种方法正在做完全相同的事情呢?我理解为什么我们使用接口-它建立了一个契约,任何实现它的类都必须有特定的方法和属性。但是,如果通过简单的继承可以实现相同的事情,那么抽象类的用途是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-28 23:49:15

抽象类的一件重要事情-- it 不能实例化。因此,根据问题的性质,有时您会想要使用它。

动物实际上就是一个很好的例子:

因为世界上没有动物的例子,而只有特有的动物的实例。因此,您可能希望有一个抽象类Animal,而特定的动物类将对它进行扩展,并实现它的抽象方法。

此外,您还可以在抽象类中使用非抽象方法--在对每个扩展类都有共享/公共行为时使用这些方法。

票数 5
EN

Stack Overflow用户

发布于 2017-07-28 23:52:53

没有使动物抽象或界面,就会打破一些基本的概念。我建议你读这里

作为一个例子,为什么您发布的层次结构在您的场景中是错误的。任何人都可以这样做:

代码语言:javascript
复制
Animal noanimal = new Animal();
noanimal.sound();

这完全没有意义;动物在你的场景中是抽象的,而不是具体的。你不应该能够实例化“动物”,而是它的具体实现之一。

而且,从场景的角度来看,动物应该是一个接口。它没有提供任何可供其子级共享的公共实现(即使是这样,我也会保留BaseAnimal作为接口,只使用一个抽象类;或者只使用组合,但这不在这个问题的范围之内)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45383794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档