假设我有一个动物类,我想为每种动物提供不同的类和功能。有两种方法可以这样做:
Animal抽象类:
抽象公共类动物{抽象公共虚音();}公共类狗扩展动物{公共空音(){System.out.println(“树皮”);}公共静态空音主(String[] args) {String[]狗=新狗();dog.sound();}那么,为什么我们要使用抽象类,而第一种方法正在做完全相同的事情呢?我理解为什么我们使用接口-它建立了一个契约,任何实现它的类都必须有特定的方法和属性。但是,如果通过简单的继承可以实现相同的事情,那么抽象类的用途是什么呢?
发布于 2017-07-28 23:49:15
抽象类的一件重要事情-- it 不能实例化。因此,根据问题的性质,有时您会想要使用它。
动物实际上就是一个很好的例子:
因为世界上没有动物的例子,而只有特有的动物的实例。因此,您可能希望有一个抽象类Animal,而特定的动物类将对它进行扩展,并实现它的抽象方法。
此外,您还可以在抽象类中使用非抽象方法--在对每个扩展类都有共享/公共行为时使用这些方法。
发布于 2017-07-28 23:52:53
没有使动物抽象或界面,就会打破一些基本的概念。我建议你读这里。
作为一个例子,为什么您发布的层次结构在您的场景中是错误的。任何人都可以这样做:
Animal noanimal = new Animal();
noanimal.sound();这完全没有意义;动物在你的场景中是抽象的,而不是具体的。你不应该能够实例化“动物”,而是它的具体实现之一。
而且,从场景的角度来看,动物应该是一个接口。它没有提供任何可供其子级共享的公共实现(即使是这样,我也会保留BaseAnimal作为接口,只使用一个抽象类;或者只使用组合,但这不在这个问题的范围之内)。
https://stackoverflow.com/questions/45383794
复制相似问题