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

17

我了解面向对象编程的基本概念[继承,抽象,封装,多态]

我们在父子关系的情况下使用继承[子类可以拥有父类所有功能,并且还可以为自己添加更多功能]

而在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:    
Parent here
5

所以我认为,

继承:我们需要在子类中重写该方法。

抽象类:在方法名中放置abstract关键字并且需要在子类中实现该方法。

所以无论是否使用abstract关键字,继承和抽象类是相同的。

因此,我们可以使用继承来实现抽象类,这里只需更改方法签名的类(这是我的信念)。

是否存在任何显着的差异?


对不起,我忘了提到抽象类,这里我谈论的是抽象类和继承之间的主要区别。 - Pratik Patel
6个回答

14

继承是为了继承属性并拥有自己的一些属性。

抽象是为了限制不能直接实例化。

例子:
我们来看Vehicle和VehiclePart。但是Vehicle本身非常抽象而且不完整。所以我们想要将Vehicle类设为抽象类,因为我们不想直接实例化它。Car是比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继承了名称等属性。覆盖是可选的。例如,RacingCar可以覆盖Car的某些方法并使其更加自定义化。但基本上它正在从基类中获取(继承)一些属性。例如,汽车的所有基本属性都将在Car中而不是RacingCar中。RacingCar将具有特定于它的属性。


抽象类: 在方法名称中放置abstract关键字,需要在子类中实现该方法

不是的。这只是为了限制其实例化。例如,我们不想实例化Vehicle对象,因为这没有意义。车辆必须是类似于汽车、公共汽车等等的东西。它不能只是一个车辆。所以我们使用abstract关键字来限制实例化。


3
自 Java 8 以后,接口(Interface)可以拥有静态方法和默认方法(Default Method),这使得接口和抽象类更加相似。
但是抽象类本身就是一个类,因此可以有构造函数、实例变量、getter 和 setter 方法来改变对象的状态。而这些功能都不是接口提供的。这就是 Java 8 后接口和抽象类之间的主要区别。

1

通过继承,您无需覆盖方法。在没有覆盖Child中的getROI的情况下,您仍然可以调用new Child().getROI()并获得0作为响应。

另一方面,如果一个方法是抽象的,它将需要被子类实现,因为没有默认实现。


1

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

new Parent()

不允许。

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


1

抽象类:

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

继承:

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

0

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

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

所以这些是为不同目的而存在的两个不同的东西。

如果这是关于实现(编码),显然与在方法名中放置抽象关键字有所不同。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接