【问题标题】:What is exact difference between Inheritance and Abstract class?继承和抽象类之间的确切区别是什么?
【发布时间】:2017-03-30 08:04:48
【问题描述】:

我了解 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关键字,需要在子类中实现方法

所以继承和抽象类是一样的不管抽象关键字是什么

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

有什么明显的区别吗?

【问题讨论】:

  • 对了不好意思忘了说抽象类,这里我说一下抽象类和继承的主要区别

标签: java oop inheritance abstract-class abstraction


【解决方案1】:

抽象类:

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

继承:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        继承用于继承属性并拥有自己的一些属性。

        Abstract是限制实例化。

        示例:
        让我们来看看 Vehicle 和 VehiclePart。但是车辆本身非常抽象且不完整。所以我们想要 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 对象,因为它没有任何意义。车辆必须是汽车、公共汽车等。它不能只是车辆。所以我们把抽象和限制实例化。

        【讨论】:

          【解决方案5】:

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

          new Parent()
          

          不允许。

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

          【讨论】:

            【解决方案6】:

            通过继承,您无需重写方法。如果不覆盖 Child 中的 getROI,您仍然可以调用 new Child().getROI() 并获得 0 作为响应。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-11-04
              • 2011-04-04
              • 2016-01-19
              • 2013-03-25
              • 2016-01-19
              • 1970-01-01
              相关资源
              最近更新 更多