Javaの継承


継承は、階層クラスの作成を可能にするため、Java オブジェクト指向プログラミング テクノロジの基礎です。継承は、あるオブジェクトが別のオブジェクトから属性を取得するプロセスとして理解できます。

クラス A がクラス B の親クラスであり、クラス B がクラス C の親クラスである場合、C は A のサブクラスであり、クラス C はクラス A から継承するとも言います。 Java では、クラスの継承は単一継承です。つまり、サブクラスは親クラスを 1 つだけ持つことができます。継承で最も一般的に使用される 2 つのキーワードは、extends とimplements です。

これら 2 つのキーワードの使用により、あるオブジェクトが別のオブジェクトと IS-A (is one) 関係を持つかどうかが決まります。

これら 2 つのキーワードを使用すると、1 つのオブジェクトを実現して、別のオブジェクトのプロパティを取得できます。

すべての Java クラスは java.lang.Object クラスから継承されるため、Object はすべてのクラスの祖先クラスであり、Object を除くすべてのクラスには親クラスが必要です。

extends キーワードを使用して、クラスが別のクラスを継承することを宣言できます。一般的な形式は次のとおりです。

// A.java
public class A {
    private int i;
    protected int j;
 
    public void func() {
 
    }
}
 
// B.java
public class B extends A {
}

上記のコード スニペットは、B が A から継承され、B が A のサブクラスであることを示しています。 A は Object のサブクラスであり、ここで明示的に宣言しなくても宣言できます。

サブクラスとして、B のインスタンスは A のすべてのメンバー変数を持ちますが、プライベート メンバー変数 B へのアクセス権を持たないため、A のカプセル化が保証されます。


IS-A関係

IS-Aとは、あるオブジェクトが別のオブジェクトの分類であることを意味します。

以下は、キーワード extends を使用した継承の実装です。

public class Animal{
}

public class Mammal extends Animal{
}

public class Reptile extends Animal{
}

public class Dog extends Mammal{
}

上記の例に基づくと、次のステートメントは正しいです:

    Animal クラスは Mammal クラスの親クラスです。
  • Animal クラスは、Reptile クラスの親クラスです。
  • 哺乳類クラスと爬虫類クラスは動物クラスのサブクラスです。
  • Dog クラスは、Mammal クラスと Animal クラスの両方のサブクラスです。
  • 上記の例の IS-A 関係を次のように分析します。

    哺乳類は動物です
  • 爬虫類は動物です
  • Dog IS-A Mammal
  • したがって、 Dog IS-A Animal

キーワード

extends

を使用すると、サブクラスは親クラスのすべてのメソッドとプロパティを継承できますが、プライベート (プライベート) メソッドとプロパティは使用できません。 instanceof 演算子を使用することで、哺乳類 IS-A Animal のインスタンスを決定できます


public class Dog extends Mammal{

   public static void main(String args[]){

      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

上記の例のコンパイルと実行結果は次のとおりです:

true
true
true

extends

キーワードを導入した後、 implements キーを見てください。IS-A 関係を表現するためにこの単語がどのように使用されているかを確認してください。

Implements キーワードは、クラスがインターフェイスを継承するときに使用されます。 この場合、キーワード extends は使用できません。

Instance

public interface Animal {}

public class Mammal implements Animal{
}

public class Dog extends Mammal{
}

instanceofキーワード

instanceof演算子を使用して、哺乳類と犬のオブジェクトがAnimalクラスのインスタンスであるかどうかを確認できます。

interface Animal{}

class Mammal implements Animal{}

public class Dog extends Mammal{
   public static void main(String args[]){

      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

上記の例のコンパイル結果と実行結果は次のとおりです:

true
true
true

HAS-A 関係

HAS-A は、クラスとそのメンバー間の依存関係を表します。これにより、コードの再利用が容易になり、コード エラーが減少します。

public class Vehicle{}
public class Speed{}
public class Van extends Vehicle{
	private Speed sp;
}

Van クラスと Speed クラスは HAS-A 関係 (Van には Speed がある) があるため、Speed クラスのコードをすべて Van クラスに貼り付ける必要はなく、 Speed クラスは複数のアプリケーション プログラムで再利用することもできます。

オブジェクト指向機能では、ユーザーはクラスが内部でどのように実装されるかを心配する必要はありません。

Van クラスは実装の詳細をユーザーに対して隠します。そのため、ユーザーは特定の関数を完了するために Van クラスを呼び出す方法だけを知る必要があり、Van クラス自体がそれを実行するのか、それとも他のクラスを呼び出して実行するのかを知る必要はありません。これらのタスク。

Java は単一継承のみをサポートします。つまり、1 つのクラスが複数のクラスを継承することはできません。

以下の実践は違法です:

public class extends Animal, Mammal{}

Java は単一継承 (基本クラスと抽象クラスの継承) のみをサポートしますが、インターフェースを使用して実装することができます (複数の継承インターフェースを実装) スクリプトの構造は次のとおりです:

public class Apple extends Fruit implements Fruit1, Fruit2{}

全般 基本クラスと抽象クラスを継承するには extends キーワードを使用し、インターフェイス クラスの継承を実装するにはimplements キーワードを使用します。