Java での IS A vs HAS A

Rupam Yadav 2023年10月12日
  1. Java における IS-A 関係
  2. Java での HAS-A 関係
  3. IS-A 関係と HAS-A 関係の主な違い
Java での IS A vs HAS A

オブジェクト指向プログラミング言語を使用する主な機能の 1つは、コードを複数回再利用できることです。一般に、再利用性を実現するために、継承と構成の 2つの概念を使用できます。

継承は IS-A 関係であり、コンポジションは HAS-A 関係です。どちらの概念も特定の点で異なりますが、同じ目標である再利用性があります。

以下に、これら 2つの概念の違いを見てみましょう。

Java における IS-A 関係

Java の継承または IS-A 関係は、2つ以上のクラスの関係を指します。継承は、Java の extends キーワードを利用することで実現できます。親クラスを継承して、子クラスでそのメソッドと変数を使用できます。

以下のサンプルコードには、AnimalDog の 2つのクラスがあり、Animal クラスには文字列を返す関数 whatAmI() があり、Dog クラス extends クラス Animal これは継承の概念です。

この DogAnimal の関係です。Dog クラスは、その親クラスから whatAmI() メソッドにアクセスできるようになりました。

class Animal {
  public String whatAmI() {
    return "I belong to Animal class";
  }
}

class Dog extends Animal {
  public void aboutMe() {
    System.out.println("I am a Dog class and " + whatAmI());
  }
}

出力:

I am a Dog class and I belong to Animal class

Java での HAS-A 関係

継承とは異なり、コンポジションや HAS-A 関係では、extends のようなキーワードを使用しません。親クラスまたはこのメソッドで使用するクラスのオブジェクトを作成します。

次の例でも、LegsDog の 2つのクラスがあります。

Legs にはメソッド howManyLegs() があります。Dog クラスでは、Legs クラスのオブジェクトを作成し、そのオブジェクトを使用して howManyLegs() 関数を呼び出します。

ここでは、Dog HAS-A Legs または Dog クラス HAS-A Legs プロパティというコンポジションの概念が適用されていることがわかります。

class Legs {
  public String howManyLegs() {
    return "I have four legs";
  }
}

class Dog {
  Legs legs = new Legs();

  public void aboutMe() {
    System.out.println("I am a Dog class and " + legs.howManyLegs());
  }
}

出力:

I am a Dog class and I have four legs

IS-A 関係と HAS-A 関係の主な違い

IS-A HAS-A
継承の概念です。 それは合成の概念である
1つのクラスが複数のクラスを継承することはできない。 あるクラスは他の複数のクラスと HAS-A 関係を持つことができる
継承では最終クラスは拡張できない コンポジションでは final クラスを再利用できる
継承は静的な結合であり、実行時に変更することはできない コンポジションは動的結合で、変更に柔軟に対応できる
著者: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn