Java - If you can extend any class then what is the point of some being abstract?
所以抽象类可以扩展,但是任何类都可以扩展吗?那么,为什么某些特定的类是抽象的,而其他的类不是?
此外,我试图弄明白,但是我总是很困惑,但是接口和抽象类之间的实际区别是什么?
感谢任何能帮我解决这个问题的人!
- 这是一个关于语言概念的基本问题。你最好读一本书或浏览维基百科。
- 第二个问题在这里回答。
- 你的问题在这里和其他地方都讨论得很透彻。最好是问一些更具体的误会点。现有的讨论会让你困惑吗?
- @HoverCraftfulloFeel的主要问题是:如果可以扩展任何类,抽象类的意义是什么?扩展类或抽象类没有区别,是吗?
- 抽象类可以声明方法签名而不实现它们。它允许调用它们,但扩展类必须实现它们。
- @蒂姆:有些类不应该实例化。例如,考虑一个动物类。在某些情况下,创建一个动物对象是没有意义的,而创建一个特定子类的实例(如老虎实例)则更有意义。
- @举个例子,您可以有一个抽象类human,它声明了一个抽象方法public abstract string getgender()。然后,您可以有一个具体的类male和male,它以不同的方式实现getgender()方法。在您的类中,您可以有一个ToString()方法调用该getgender()方法,而不必事先知道它的主体。
- 为了参考,为了完整性的缘故,你不能只在爪哇"扩展任何类"。如果一个类被声明为final,编译器将不允许您扩展它。
- 当你被要求制造导弹时,你的第一步是什么?构建不完全知道的东西的第一步是将其抽象出来。所以对于导弹,你会认为1-让我们在里面有一些爆炸性的成分。现在你肯定知道导弹必须有爆炸物,但你不知道它是什么,直到你知道(很晚的时间点)我想建立一个潜艇发射的弹道导弹,并配备核弹头,从核动力弹道导弹潜艇(SSBNS)等发射。那时候你有具体的课程。
接口只能描述方法签名,例如
1
| public void add(int a, int b); |
实现它的类必须定义方法。
抽象类只能继承,但它仍然可以定义一个方法:
1 2 3
| public void add(int a, int b) {
return a+b;
} |
号
任何实现它的类都可以使用这个方法。抽象类也可以实现final方法,因此它们永远不能由扩展它的类重新实现。
- 所以最终的方法不能被重写?继承抽象类时,它还必须定义所有未实现的方法吗?谢谢。
- @TimYes(这是最后一个关键字的要点)和Yes,或者它也必须是抽象的。
抽象类的点是有意义的默认行为。
抽象类可以在那些有意义的方法中提供有意义的默认实现,并且只保留抽象方法供客户端实现。如果愿意,客户机可以选择重写这些默认实现。
接口不提供这样的机会;它们都是必须由客户机实现的抽象方法。
这不是一个非此即彼的主张;通常两者都有。例如,参见java.util.Map和java.util.AbstractMap。
抽象类的有用性在于将多个类共用的功能(方法和属性)考虑在内。而且,说任何类都可以扩展是不正确的,最后的类不能扩展。
抽象类不同于接口,因为接口只定义了一个功能契约:需要完成什么,但从不指示如何实现它,而抽象类可以充实一些一般的、抽象的实现细节,但让具体方面由其子类实现。在某种程度上,抽象类就像是接口和具体类之间的中间点。