web-dev-qa-db-ja.com

継承クラスと抽象クラスの正確な違いは何ですか?

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

だから私は思う、

継承:子クラスのメソッドをオーバーライドする必要があります

抽象クラ​​ス:メソッド名に抽象キーワードを入れ、子クラスにメソッドを実装する必要があります

したがって、抽象キーワードに関係なく、継承と抽象クラスは同じです

したがって、継承を使用して抽象クラスを実装できます。ここでは、メソッドシグネチャ変更クラスだけです(これが私の信念です)。

大きな違いはありますか?

5
Pratik Patel

継承は、プロパティを継承し、独自のプロパティもいくつか持つためのものです。

Abstractは、インスタンス化を制限することです。

例:
VehicleとVehiclePartを取り上げましょう。しかし、Vehicle自体は非常に抽象的であり、完全ではありません。したがって、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のメソッドをオーバーライドして、少しカスタムにすることができます。しかし、基本的には、基本クラスからいくつかのプロパティを取得(継承)しています。車のすべての基本的なプロパティと同様に、RacingCarではなくCarになります。 RacingCarには固有のプロパティがあります。


抽象クラス:メソッド名に抽象キーワードを入れ、子クラスにメソッドを実装する必要があります

いいえ。そのインスタンス化を制限するだけです。例えば。 Vehicleオブジェクトには意味がないため、インスタンス化する必要はありません。乗り物は車やバスなどのようなものでなければなりません。それは単なる乗り物ではありません。したがって、抽象化を行い、インスタンス化を制限します。

6
prem kumar

継承を使用すると、メソッドをオーバーライドする必要はありません。 getROIChildをオーバーライドしなくても、new Child().getROI()を呼び出して、応答として0を取得できます。

一方、メソッドが抽象である場合、デフォルトの実装がないため、子が実装する必要があります。

1
AleSod

抽象クラスは、直接インスタンス化できないことを意味します。

new Parent()

許可されていません。

抽象メソッドは、拡張クラスに実装する必要があります。

0
Marius