例を使用した Java OOP のポリモーフィズム:動的とは何か
Java のポリモーフィズムとは
ポリモーフィズム in Java は、継承によって相互に関連する 1 つ以上のクラスまたはオブジェクトがある場合に発生します。これは、オブジェクトがさまざまな形をとる能力です。継承により、ユーザーは属性とメソッドを継承でき、ポリモーフィズムはこれらのメソッドを使用してさまざまなタスクを実行します。つまり、目標はコミュニケーションですが、アプローチは異なります。
たとえば、通信用のスマートフォンがあります。選択する通信モードは何でもかまいません。それは、電話、テキスト メッセージ、画像メッセージ、メールなどです。したがって、目的はコミュニケーションであるという共通点がありますが、両者のアプローチは異なります。これはポリモーフィズムと呼ばれます。 それでは、例を使って Java のポリモーフィズムを学びましょう。
この Java チュートリアルでは、次のことを学びます-
- Java のポリモーフィズムとは?
- OOP の Java ポリモーフィズムと例
- Java でのメソッドのオーバーライド
- オーバーロードとオーバーライドの違い
- 動的ポリモーフィズムとは
- 静的ポリモーフィズムと動的ポリモーフィズムの違い
- Java のスーパー キーワード
センター>
ビデオにアクセスできない場合は、ここをクリックしてください
OOP での Java ポリモーフィズムと例
預金と引き出しの機能を持つ「アカウント」という1つの親クラスがあります。アカウントには 2 つの子クラスがあります
預金と引き出しの操作は、普通預金口座と当座預金口座で同じです。したがって、Account クラスから継承されたメソッドが機能します。
<センター>
<図>
Java ポリモーフィズムの例
フィギュア>センター>
ソフトウェア要件の変更
要件仕様に変更があり、ソフトウェア業界ではよくあることです。当座貸越機能を備えた機能特権銀行口座を追加することになっています。
背景として、当座貸越とは、アカウントの利用可能な残高よりも多くの金額を引き出すことができる機能です。
したがって、特権ニーズのメソッドを撤回して、新たに実装する必要があります。ただし、テスト済みの普通預金口座のコード部分は変更しません。これがOOPSの利点です
ステップ 1) アカウントを保存するための「撤回」メソッドが呼び出されたときに、親アカウント クラスのメソッドが実行されるように
ステップ 2) ただし、特権口座(当座貸越機能)の「Withdraw」メソッドを呼び出すと、特権クラスで定義されたwithdrawメソッドが実行されます。これがOOP のポリモーフィズムです。
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(); } }
オーバーロードとオーバーライドの違い
メソッドのオーバーライド | |
---|---|
メソッドのオーバーロードが同じクラスにあり、複数のメソッドの名前が同じでシグネチャが異なる。 | メソッドのオーバーライドは、スーパー クラスのメソッドの 1 つがサブクラスで再定義される場合です。この場合、メソッドのシグネチャは変わりません。 |
例: 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 のメソッドを呼び出します
これは実行時に決定されるため、動的と呼ばれます またはランタイム ポリモーフィズム
静的ポリモーフィズムと動的ポリモーフィズムの違い
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) エラー =?これは、サブクラスがスーパー クラスのプライベート メンバーにアクセスできないためです。
まとめ
- オブジェクト指向プログラミングにおけるポリモーフィズムは、1 つ以上のクラスまたはオブジェクトが継承によって相互に関連付けられている場合に発生します。オブジェクトがさまざまな形をとる能力です。
- メソッドのオーバーライドとは、サブクラスでスーパー クラス メソッドを再定義することです。
- Java の動的ポリモーフィズムは、スーパークラスとサブクラスで同じ名前と署名を持つ複数のメソッドを定義できるメカニズムです。
- Java の静的ポリモーフィズムは、コンパイル時にメソッドを呼び出すための情報を収集するポリモーフィズムの一種であり、動的ポリモーフィズムは、実行時にメソッドを呼び出すための情報を収集するポリモーフィズムの一種です。
- スーパー キーワードを使用して、子クラスから親クラスのメソッドにアクセスできます。
Java
- Java ポリモーフィズム
- 例を含む C# 抽象クラスのチュートリアル:抽象化とは?
- 例を使用したC#のインターフェイスとは
- Java における OOP の概念 |基礎と例
- Java の String Length() メソッド:例で見つける方法
- Java String charAt() メソッドと例
- Java String contains() メソッド |部分文字列を例でチェック
- 例を使用したJava文字列のendsWith()メソッド
- Javaの静的変数:静的ブロック&メソッドとは【例】
- Java のインターフェイスと抽象クラス:違いは何ですか?
- Java BufferedReader:例を使用して Java でファイルを読み取る方法