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

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

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

たとえば、コミュニケーションのためにスマートフォンを持っているとします。選択するコミュニケーションモードは何でもかまいません。通話、テキストメッセージ、画像メッセージ、メールなどです。つまり、目的はコミュニケーションであるのは共通ですが、アプローチは異なります。これを「コミュニケーション」と呼びます。 多態性。 さて、ポリモーフィズムについて学びましょう Java 例を挙げて説明します。

クリック こちら ビデオにアクセスできない場合

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

預金と引き出しの機能を持つ親クラス「Account」が 2 つあります。Account には XNUMX つの子クラスがあります。預金と引き出しの操作は、普通預金口座と当座預金口座で同じです。したがって、Account クラスから継承されたメソッドが機能します。

単一継承 Java
Java ポリモーフィズムの例

ソフトウェア要件の変更

要件仕様の変更があります。これはソフトウェア業界ではよくあることです。当座貸越機能を備えた特権銀行口座に機能を追加することになっています。背景として、当座貸越とは、口座の残高を超える金額を引き出すことができる機能です。したがって、特権の引き出しメソッドを新たに実装する必要があります。ただし、貯蓄口座と当座預金口座のテスト済みのコードの一部は変更しません。これは、 おっとっと

Java ポリモーフィズム

ステップ1) 普通預金口座の「引き出し」メソッドが呼び出されたときに、親口座クラスからのメソッドが実行されるようにする

Java ポリモーフィズム

ステップ2) ただし、特権アカウント(当座貸越機能)の「Withdraw」メソッドが呼び出された場合は、特権クラスで定義されたwithdrawメソッドが実行されます。 これは OOP におけるポリモーフィズム。

Java ポリモーフィズム

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

メソッドのオーバーライドとは、サブクラスでスーパークラスのメソッドを再定義することです。

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

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

メソッドオーバーライドのルール 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();
  }
}

オーバーロードとオーバーライドの違い

メソッドのオーバーロード
メソッドのオーバーライド
メソッドのオーバーロードは同じクラス内で行われ、複数のメソッドの名前は同じですが、シグネチャが異なります。 メソッドのオーバーライドとは、スーパークラスのメソッドの XNUMX つがサブクラスで再定義されることです。 この場合、メソッドのシグネチャは変わりません。
例:

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
 }
}

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

OOP の動的ポリモーフィズムは、スーパークラスとサブクラスで複数のメソッドを同じ名前とシグネチャで定義できるメカニズムです。 オーバーライドされたメソッドの呼び出しは実行時に解決されます。

動的ポリモーフィズムの例:

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

 Doctor obj = new Surgeon();

ステートメントを検討してください

obj.treatPatient();

ここで、参照変数「obj」は親クラスのものですが、それが指すオブジェクトは子クラスのものです (以下の多態性の図の例に示すように)。

obj.treatPatient() は、サブクラス – Surgeon の treatPatient() メソッドを実行します。

基本クラス参照を使用してメソッドを呼び出す場合、呼び出されるメソッドは、参照が指しているオブジェクトに応じて JVM によって決定されます。

たとえば、obj は Doctor への参照ですが、Surgeon オブジェクトを指しているため、Surgeon のメソッドを呼び出します。

これは実行時に決定されるため、 ダイナミック or 実行時の多態性

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

静的多態性 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 を使用すると、サブクラス内のスーパー クラスの任意のデータ メンバーまたはメソッドにアクセスできます。

次に、スーパーキーワードについて学びます。 継承 および多態性 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(){
            // overriden 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) エラー = ? これは、サブクラスがスーパークラスのプライベート メンバーにアクセスできないためです。

まとめ

  • オブジェクト指向プログラミングにおけるポリモーフィズムは、XNUMX つ以上のクラスまたはオブジェクトが継承によって相互に関連している場合に発生します。 物体がさまざまな形をとる能力です。
  • メソッドのオーバーライドとは、サブクラスでスーパークラスのメソッドを再定義することです。
  • 動的ポリモーフィズム Java スーパークラスとサブクラスで同じ名前とシグネチャを持つ複数のメソッドを定義できるメカニズムです。
  • 静的多態性 Java は、コンパイル時にメソッドを呼び出すための情報を収集するポリモーフィズムの一種であるのに対し、動的ポリモーフィズムは、実行時にメソッドを呼び出すための情報を収集するポリモーフィズムの一種です。
  • super キーワードを使用すると、子クラスから親クラスのメソッドにアクセスできます。