繁体   English   中英

继承和抽象类之间的确切区别是什么?

[英]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 对象,因为它没有意义。 交通工具必须是汽车、公共汽车等。它不能只是交通工具。 所以我们把抽象和限制实例化。

使用继承,您不需要覆盖方法。 如果不重写getROIChild ,你仍然可以调用new Child().getROI()并得到0作为响应。

另一方面,如果方法是抽象的,则需要由子项实现,因为没有默认实现。

在 java 8 之后,您可以在接口中使用静态和默认方法。 所以它使接口与抽象类非常相似。

但是抽象类仍然是类,因此我们可以使用构造函数、实例变量、getter 和 setter 来更改对象的状态。 这些都是接口没有提供的功能。这是java 8之后接口和抽象类之间的主要区别。

抽象类意味着您不能直接实例化它。

new Parent()

不允许。

抽象方法需要在扩展类中实现。

这是两个不同的概念,选择是基于要求的。

抽象隐藏了实现细节,只显示了功能。 它降低了代码复杂度。 继承使用另一个类的属性创建一个类。 它提高了代码的可重用性。

所以这是出于不同目的的两种不同的东西。

如果这是关于实现(编码),显然与将抽象关键字放在方法名称中存在差异。

  • 不能在抽象类的抽象方法中实现方法体。 但是可以在父类的方法中实现方法体。
  • 在继承中,子类继承的是父类方法。 与抽象相同,子类也按原样继承父类的非抽象方法。 但是子类必须实现父类中的所有抽象方法,否则子类需要声明为抽象的。
  • 无法创建抽象类的实例。

抽象类:

  • 抽象隐藏了实现细节,只向用户展示了功能。
  • 抽象有助于降低代码的复杂性。
  • 我们不能创建抽象类的对象。

继承:

  • 继承是使用现有类的属性和方法创建新类的方法。
  • 继承有助于提高代码的可重用性。
  • 我们可以创建父类的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM