![](/img/trans.png)
[英]What is difference between abstract class with all abstract methods and interface(not technically)
[英]What is exact difference between Inheritance and Abstract class?
我知道OOP概念的基础[继承、抽象、封装、多态]
我们在父子关系的情况下使用继承[子可以拥有父拥有的所有功能,也可以为自己添加更多功能]
我们使用抽象类(在java中)作为类中方法的部分默认实现,也可以通过简单的继承来实现。
看看下面的例子,这使我的观点清楚。
继承:
父类
public class Parent {
// This method will remain same for all child classes.No need to override
public void abc() {
System.out.println("Parent here");
}
// This methods need to be overridden from child class
public int getROI() {
return 0;
}
}
儿童班
public class Child extends Parent{
@Override
public int getROI(){
return 5;
}
public static void main(String[] args) {
Child child =new Child();
child.abc();
System.out.println(child.getROI());
}
}
抽象类:
父类
abstract class Parent {
// This method will remain same for all child classes.No need to override
public void abc() {
System.out.println("Parent here");
}
// This methods need to be implemented from child class
public abstract int getROI();
}
儿童班
public class Child extends Parent{
public int getROI(){
return 5;
}
public static void main(String[] args) {
Child child =new Child();
child.abc();
System.out.println(child.getROI());
}
}
对于上述程序,o/p 将相同。
O/P:
Parent here
5
所以我认为,
继承:我们需要覆盖子类中的方法
抽象类:方法名中放置abstract关键字,需要在子类中实现该方法
所以无论抽象关键字如何,继承和抽象类都是相同的
所以我们可以使用继承来实现抽象类,这里只是方法签名更改类(这是我的信念)。
有什么显着差异吗?
继承是为了继承属性并拥有一些自己的属性。
Abstract是限制被实例化。
示例:
让我们以 Vehicle 和 VehiclePart 为例。 但是像这样的 Vehicle 非常抽象且不完整。 所以我们想要 Vehicle 类抽象,因为我们不想直接实例化它。 Car是比Vehicle更有意义的实体,car是Vehicle。 所以汽车是汽车的延伸,它不是抽象的。
abstract class Vehicle{
String name;
}
abstract class VehiclePart{
String name;
Date expiry;
}
class Car extends Vehicle{
List<VehicleParts> parts;
}
class RacingCar extends Vehicle{
}
class Gear extends VehiclePart{
int numOfGears;
}
继承:我们需要覆盖子类中的方法
不。 在上面的示例中,您可以看到 Car 继承了 Vehicle 的 name 等属性。 覆盖是可选的。 像 RacingCar 一样可以覆盖 Car 的方法并使它有点自定义。 但基本上它是从基类获取(继承)一些属性。 就像汽车的所有基本属性都将在 Car 中而不是在 RacingCar 中。 RacingCar 将具有特定于它的属性。
抽象类:方法名中放置abstract关键字,需要在子类中实现该方法
不。 只是为了限制它的实例化。 例如。 我们不想实例化 Vehicle 对象,因为它没有意义。 交通工具必须是汽车、公共汽车等。它不能只是交通工具。 所以我们把抽象和限制实例化。
使用继承,您不需要覆盖方法。 如果不重写getROI
的Child
,你仍然可以调用new Child().getROI()
并得到0
作为响应。
另一方面,如果方法是抽象的,则需要由子项实现,因为没有默认实现。
在 java 8 之后,您可以在接口中使用静态和默认方法。 所以它使接口与抽象类非常相似。
但是抽象类仍然是类,因此我们可以使用构造函数、实例变量、getter 和 setter 来更改对象的状态。 这些都是接口没有提供的功能。这是java 8之后接口和抽象类之间的主要区别。
抽象类意味着您不能直接实例化它。
new Parent()
不允许。
抽象方法需要在扩展类中实现。
这是两个不同的概念,选择是基于要求的。
抽象隐藏了实现细节,只显示了功能。 它降低了代码复杂度。 继承使用另一个类的属性创建一个类。 它提高了代码的可重用性。
所以这是出于不同目的的两种不同的东西。
如果这是关于实现(编码),显然与将抽象关键字放在方法名称中存在差异。
抽象类:
继承:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.