ポリモーフィズム Java (静的および動的)

⚡ スマートサマリー

ポリモーフィズム Java 1つのインターフェースで複数のフォームを表現できるため、同じメソッド名でも関連するクラス間で異なる動作をさせることができます。これはオブジェクト指向設計の柱であり、柔軟性、コードの再利用性、そして既存の銀行、医療、企業システムのクリーンな拡張を促進します。

  • 🎭 形態は様々だが、名称は一つ: ポリモーフィズム Java 実行時の実際のオブジェクト型に基づいて、同じメソッド名を異なる実装にディスパッチできるようにする。
  • 🔀 2つのフレーバー: コンパイル時ポリモーフィズムはメソッドオーバーロードを使用するのに対し、実行時ポリモーフィズムは継承とJVMを介したメソッドオーバーライドを使用する。
  • ⛓️ 静的バインディングと動的バインディング: オーバーロードされた呼び出しはコンパイル時に静的バインディングによって解決され、オーバーライドされた呼び出しは実行時に動的バインディングによって解決されます。
  • 強力なキーワードパワー: superキーワードを使用すると、サブクラスは親クラスの実装を呼び出し、その上に独自の特殊な動作を追加できます。
  • 🧪 現実世界への影響力: 銀行口座、病院の職員階層、形状レンダリングエンジンなどはすべて、テスト済みのコードを壊すことなく新たな要件に対応するために、ポリモーフィズムに依存している。

ポリモーフィズム Java

ポリモーフィズムとは何か Java?

ポリモーフィズム Java 継承によって1つ以上のクラスまたはオブジェクトが相互に関連付けられている場合に発生します。これは、オブジェクトがさまざまな形態をとることができる能力です。継承によってユーザーは属性とメソッドを継承でき、ポリモーフィズムはこれらのメソッドを使用してさまざまなタスクを実行します。目標はコミュニケーションですが、アプローチは異なる場合があります。

例えば、スマートフォンはコミュニケーションに使用されます。コミュニケーションの方法は、通話、テキストメッセージ、画像メッセージ、または電子メールです。目的は共通で、つまりコミュニケーションですが、アプローチは異なります。この行動は、 ポリモーフィズムこれからポリモーフィズムについて学びます Java サンプルコード、図、および段階的な説明付き。

詳しくはこちら こちら ビデオにアクセスできない場合

ポリモーフィズムを使用する理由 Java?

ポリモーフィズム Java このパターンは、コードの柔軟性、再利用性、保守性を向上させるために用いられます。親型の単一の参照変数が複数の子オブジェクトを指すことができるため、同じ呼び出しがどのサブクラスが指定されても適応します。このパターンにより、テスト済みのコードは変更されずに済み、特殊なサブクラスによって新しい動作が追加されます。SpringやJakarta EEといったフレームワークがこのパターンを採用しているのはまさにそのためです。

Java OOP におけるポリモーフィズムの例

親クラスを 1 つ考えてみましょう。 アカウント 預金と引き出しの機能を備えています。Account クラスには 2 つの子クラスがあります。預金と引き出しの操作は、普通預金口座と当座預金口座で同じなので、Account クラスから継承したメソッドが機能します。

単一継承 Java

Java ポリモーフィズムの例

ソフトウェア要件の変更

ソフトウェア業界ではよくあることですが、要件仕様に変更があります。当座貸越機能付きの特権銀行口座の機能を追加する必要があります。当座貸越とは、顧客が口座の利用可能残高を超える金額を引き出すことができる機能です。特権口座の引き出し方法は新たに実装する必要がありますが、貯蓄口座と当座預金口座のテスト済みコードは変更されません。この分離が利点です。 おっとっと.

Java ポリモーフィズム

ステップ1) 普通預金口座の引き出しメソッドが呼び出されると、親クラスであるAccountクラスで定義されているメソッドが実行されます。

Java ポリモーフィズム

ステップ2) 特権口座(当座貸越機能)の引き出しメソッドが呼び出されると、特権クラスで定義されている引き出しメソッドが実行されます。このディスパッチは オブジェクト指向プログラミングにおけるポリモーフィズム.

Java ポリモーフィズム

メソッドオーバーライド Java

メソッドオーバーライドとは、サブクラス内でスーパークラスのメソッドを再定義するプロセスです。サブクラスは同じコンテキストを保持します。tract ですが、プログラム実行時に選択される新しい実装を提供します。

メソッドオーバーライドのルール

  • メソッドシグネチャ、つまりメソッド名、パラメータリスト、および戻り値の型は、完全に一致する必要があります。
  • オーバーライドされたメソッドはアクセス範囲を広げることはできますが、狭めることはできません。基底クラスでメソッドがプライベートである場合、子クラスはそれをパブリックにすることはできますが、その逆はできません。

メソッドオーバーライドのルール Java

例:

class Doctor{
  public void treatPatient(){
  // treatPatient method
  
}
class Surgeon extends Doctor{
  public void treatPatient(){
  // treatPatient method
  }
}
class Run{
  public static void main (String args[]){
    Doctor doctorObj = new Doctor();
    // treatPatient method in class Doctor will be executed
    doctorObj.treatPatient();
   
    Surgeon surgeonObj = new Surgeon();
    // treatPatient method in class Surgeon will be executed
    surgeonObj.treatPatient();
  }
}

メソッドのオーバーロードとメソッドのオーバーライドの違い

メソッドのオーバーロードは、同じクラス内で同じメソッド名を持ちながら、異なるシグネチャを持つメソッドが使用される場合に発生します。メソッドのオーバーライドは、親クラスと子クラスの関係において、サブクラスがスーパークラスで宣言されたメソッドを再定義する場合に発生します。

メソッドのオーバーロード
メソッドのオーバーライド
メソッドオーバーロードとは、同じクラス内で、同じ名前を持つ複数のメソッドが異なるシグネチャを持つ状態を指します。 メソッドのオーバーライドとは、スーパークラスのメソッドのいずれかをサブクラスで再定義することです。この場合、メソッドのシグネチャは変更されません。
例:

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
例:

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
    //signature is same
 }
}

動的ポリモーフィズムとは何ですか?

オブジェクト指向プログラミングにおける動的ポリモーフィズムとは、スーパークラスとサブクラスにおいて、同じ名前とシグネチャを持つ複数のメソッドを定義できる仕組みです。オーバーライドされたメソッドの呼び出しは、JVM内部の動的バインディングによって実行時に解決されます。

動的多態性の例

スーパークラスの参照変数は、サブクラスのオブジェクトを参照できます。

 Doctor obj = new Surgeon();

次の記述について考えてみましょう。

obj.treatPatient();

ここで参照変数 オブジェクト は親クラスのものですが、それが指しているオブジェクトは子クラスのものです。これは、ポリモーフィズムの図に示されています。

呼び出し obj.treatPatient() サブクラス Surgeon の treatPatient() メソッドが実行されます。基底クラス参照を使用してメソッドを呼び出す場合、呼び出されるメソッドは、参照が指している実際のオブジェクトに基づいて JVM によって決定されます。 オブジェクト Doctor への参照であり、Surgeon オブジェクトを指しているため、Surgeon のメソッドを呼び出します。決定は実行時に行われるため、このように呼ばれます。 動的ポリモーフィズム あるいは実行時多態性。

静的ポリモーフィズムと動的ポリモーフィズムの違い

静的多態性 Java はコンパイル時にメソッド呼び出しのための情報を収集するタイプのポリモーフィズムであり、動的ポリモーフィズムは実行時にメソッド呼び出しのための情報を収集するタイプのポリモーフィズムです。

静的ポリモーフィズム
動的ポリモーフィズム
これはメソッドのオーバーロードに関連しています。 これはメソッドのオーバーライドに関連しています。
エラーが発生した場合は、コンパイル時に解決されます。コンパイル時にコードは実行されないため、名前は静的です。

例:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.
参照変数がオーバーライドされたメソッドを呼び出す場合、呼び出されるメソッドは、その参照変数が指すオブジェクトによって決定されます。これはコードの実行時にのみ決定できるため、メソッド名は動的になります。

例:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

スーパーキーワード Java

Surgeon クラスの treatPatient メソッドが Doctor クラスで定義された機能を実行した後、独自の動作を実行したい場合はどうすればよいでしょうか? この場合、キーワード super 子クラスから親クラスのメソッドにアクセスするために使用できます。Surgeon クラスの treatPatient メソッドは次のように記述できます。

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

キーワード super を使用すると、サブクラス内からスーパークラスの任意のデータ メンバーまたはメソッドにアクセスできます。次に、super キーワードについて学習します。 継承、および多型性 Java サンプルプログラム付き。

例:継承、ポリモーフィズム、およびスーパーキーワードを学ぶ

ステップ1) 次のコードをエディターにコピーします。

public class Test{
     public static void main(String args[]){
        X x= new X();
        Y y = new Y();
        y.m2();
        //x.m1();
        //y.m1();
        //x = y;// parent pointing to object of child
        //x.m1() ;
        //y.a=10;
   }
}
class X{
   private int a;
   int b;
      public void m1(){
       System.out.println("This is method m1 of class X");
     }
}
class Y extends X{
      int c; // new instance variable of class Y
         public void m1(){
            // overridden method
            System.out.println("This is method m1 of class Y");
        }
       public void m2(){
           super.m1();
           System.out.println("This is method m2 of class Y");
      }
}

ステップ2) コードを保存、コンパイル、実行してください。出力結果を確認してください。

ステップ3) 6行目から9行目までのコメントを解除してください。コードを保存、コンパイル、実行してください。出力結果を確認してください。

ステップ4) 10行目のコメントを解除してください。コードを保存してコンパイルしてください。

ステップ5) エラー = ? これは、サブクラスがスーパークラスのプライベートメンバーにアクセスできないためです。

よくあるご質問

ポリモーフィズム Java オブジェクトが様々な形態をとれる能力のことです。同じメソッド名でも、実行時に参照されるサブクラスオブジェクトによって異なるコードが実行される可能性があり、これがオブジェクト指向プログラミングの中核的な動作です。

Java メソッドオーバーロードによるコンパイル時ポリモーフィズムと、メソッドオーバーライドによる実行時ポリモーフィズムをサポートします。オーバーロードはコンパイル時に静的バインディングによって解決され、オーバーライドはJVMによって処理される動的バインディングによって実行時に解決されます。

静的バインディングはコンパイル時にメソッド呼び出しをその定義にリンクし、メソッドオーバーロードに使用されます。動的バインディングは実行時に実際のオブジェクト型に基づいて呼び出しをリンクし、メソッドオーバーライドを可能にします。 Java.

`super`キーワードを使用すると、サブクラスは親クラスのオーバーライドされたメソッドを呼び出したり、親クラスのデータメンバーにアクセスしたりできます。これにより、子クラスは親クラスのロジックを再利用し、その上に独自の動作を追加できます。

ChatGPTやGitHub Copilot ChatなどのAIチューターは、ポリモーフィズムを説明できます。 Java カスタムな例えを用いて練習問題を生成し、継承ツリーを順を追って説明し、静的バインディングと動的バインディングの違いについて学習者にクイズを出題することで、より迅速な習得を可能にします。

はい。Cursor、Sourcegraph Cody、IntelliJ AI AssistantなどのAI駆動型リファクタリングアシスタントは、重複した条件分岐を検出し、クラス階層を提案し、レガシーコードを書き換えることができます。 Java メソッドオーバーライドによって、繰り返されるif-elseチェーンを置き換えるようにコードを修正します。