what is polymorphism java tutorial with examples
このチュートリアルでは、Javaのポリモーフィズムとは何か、ポリモーフィズムのタイプ、およびコンパイル時のポリモーフィズムを実装する方法を例を挙げて説明します。
「ポリモーフィズム」という言葉は、2つの言葉から派生しています。 「ポリ」 これは多くのことを意味し、「 モーフ 」はフォームを意味します。したがって、ポリモーフィズムは多くの形態を意味します。プログラミング言語では、オブジェクトはさまざまな形をとることができるため、オブジェクトはポリモーフィックであると言えます。
ポリモーフィズムは、OOPの最も重要な機能の1つであり、機能(オブジェクト、メッセージ、メソッド、または演算子)をさまざまな形式で表現できます。
セレンウェブドライバーでポップアップウィンドウを処理する方法
学習内容:
Javaのポリモーフィズム入門
多形エンティティは、さまざまなシナリオでさまざまに動作します。
例えば、 Javaの「+」(加算)演算子について考えてみます。これは二項演算子であり、2つのオペランドを取ります。 「+」演算子に渡されるオペランドが数値の場合、2つの数値の合計を返す加算演算が実行されます。
オペランドが文字列型に変更されると、「+」演算子は文字列オブジェクトを追加しませんが、文字列の内容を連結または結合して、結果の3番目の文字列を形成します。
例えば、 「 1 」と「 二 」は2つのStringオブジェクトの内容です。 「1」+「2」 結果は「 ワンツー 」。これは連結です。
Javaでは、すべてのオブジェクトは「Object」クラスから派生しているため、すべて多形であり、Objectクラスとの「IS-A」関係を満たします。
オブジェクトは常に、その特定のクラスタイプの参照変数を介してアクセスされます。特定のタイプの参照変数が宣言されると、それを変更することはできません。ただし、参照変数が「最終」として宣言されていない場合は、他のオブジェクトを指すように再割り当てできます。
このオブジェクト参照のタイプによって、呼び出す必要のあるクラスメソッドまたは関数が決まります。
例えば、ABCクラスとABCから派生したクラスXYZがある場合、両方のクラスにポリモーフィックメソッドfunc()があります。
class ABC{ void func(){} } class XYZ extends ABC{ void func() {} }
タイプABCの参照を作成しましょう。
obj = new XYZ ();
ここで、func()メソッドを呼び出すと、objが指すオブジェクトはクラスXYZであるため、クラスXYZのfunc()メソッドが呼び出されます。
上記の例で見たように、メソッドfunc()の実装は異なりますが、プロトタイプは同じです。参照オブジェクトが指すオブジェクトに応じて、そのシナリオで適切な実装が呼び出されます。これがポリモーフィズムです。
Javaのポリモーフィズムについて詳しく説明しましょう。
Javaポリモーフィズムの例
前に説明した加算演算を使用したJavaのポリモーフィズムの簡単な例を理解しましょう。
ここでは、名前は同じでパラメーターが異なる2つのメソッドを使用します。最初の関数は2つの整数パラメーターを受け入れ、2番目のメソッドは2つの文字列パラメーターを受け入れます。
渡されたパラメーターのタイプに応じて、適切なメソッドが呼び出され、2つの整数を追加して結果を出力するか、2つの文字列を連結して結果の文字列を出力します。
Javaプログラムを以下に示します。
class Addition_operation{ //method to add two integers void addition_func(int num1,int num2){ System.out.println('ABC::addition_func:' + (num1+num2)); } //overloaded method to add two strings void addition_func(String str1, String str2){ String result = str1 + ' ' + str2; System.out.println('XYZ::addition_func:' + result); } } public class Main { public static void main(String() args) { Addition_operation abc = new Addition_operation(); //create a class object abc.addition_func (3,4); //calls 1st method abc.addition_func ('Hello' , 'World!'); //calls 2nd method } }
出力:
ここで、最初に2つの整数パラメーターをaddition_funcに渡すときに、最初のメソッドが呼び出されることを確認しました。 2番目の関数呼び出しでは、2つのString型パラメーターを渡すため、2番目のオーバーロードされたメソッドが呼び出されます。
ポリモーフィズムの種類
Javaは、次の2種類のポリモーフィズムをサポートしています。
- コンパイル時のポリモーフィズム
- 実行時のポリモーフィズム
名前が示すように、コンパイル時のポリモーフィズムはコンパイル時に実行され、実行時のポリモーフィズムは実行時に実行されます。
上の図に示すように、コンパイル時のポリモーフィズムはオーバーロードによって実装されます。メソッドまたは演算子のいずれかをオーバーロードできます。ランタイムポリモーフィズムは、オーバーライドによって実現されます。
このチュートリアルでは、コンパイル時のポリモーフィズムについて詳しく説明します。次のチュートリアルでは、ランタイムポリモーフィズムについて説明します。
Javaでのコンパイル時ポリモーフィズム
コンパイル時のポリモーフィズムは、「静的ポリモーフィズム」とも呼ばれます。コンパイル時のポリモーフィズムの一部として、実行されるポリモーフィズムはすべて、コンパイル時に実行されます。
Javaでは、コンパイル時のポリモーフィズムは「 メソッドのオーバーロード 」。メソッドのオーバーロードを使用すると、同じ名前で、パラメーターの数、タイプ、または順序のみで区別される1つ以上のメソッドを持つことができます。
メソッドのオーバーロードは、Javaでのコンパイル時ポリモーフィズムの最も一般的な実装です。 Javaは、演算子のオーバーロードもサポートしています。
一般的なJavaのオーバーロードとは何ですか?
Javaでのオーバーロードは、名前と戻り値の型が同じであるが、引数のシーケンス、数、および型が異なる複数のメソッドを持つプロセスです。一般に、メソッドのオーバーロードとも呼ばれます。
Javaでのメソッドのオーバーロード
メソッドのオーバーロードは、Javaでのコンパイル時のポリモーフィズムの実装です。名前や戻り値の型が同じでパラメータリストが異なる1つ以上のメソッドがある場合、メソッドを「オーバーロード」したと言います。
したがって、特定のクラスでは、名前は同じで引数リストが異なるさまざまなメソッドを使用できます。
オーバーロードされたメソッドを呼び出すにはどうすればよいですか?または、コンパイラはどのメソッドが呼び出されるかをどのように認識しますか?
呼び出しに一致する正確なメソッドの呼び出しは、パラメーターリストに応じて実行されます。
Javaのクラスが複数のコンストラクターを持つことができることはすでに見てきました。コンストラクターの場合、引数リストまたはコンストラクターが受け入れる引数は、すべてのコンストラクターで異なります。これはオーバーロードの例です。したがって、コンストラクターのオーバーロードは、Javaでのメソッドのオーバーロードの基本的な形式です。
では、Javaでメソッドをオーバーロードする方法を見てみましょう。
Javaは、パラメーター/引数リストのバリエーションに応じて、メソッドのオーバーロードの3つの方法を提供します。
#1)パラメータの種類
パラメータのデータ型に応じて、Javaのメソッドをオーバーロードできます。
次の例を考えてみましょう。ここでは、3つの方法のプロトタイプを示しています。
加算(int、int);
加算(int、float);
追加(文字列、文字列);
上からわかるように、3つのケースすべてで同じメソッド名と同じ数のパラメーターがありますが、各メソッド呼び出しには異なるタイプのパラメーターがあります。
メソッドが異なるタイプのパラメーターを持っている限り、メソッドはオーバーロードされていると言えます。メソッドを呼び出すと、コンパイラーがパラメーターのデータ型を決定し、メソッド呼び出しで提供されるパラメーターリストのデータ型に応じて、適切なメソッドが呼び出されます。
例えば、以下のようなメソッド呼び出しがある場合:
追加(3、3.5);
上記のメソッド呼び出しでは、最初のパラメーターがint型であり、2番目のパラメーターがfloat型であることがわかります。上記の呼び出しが発生すると、コンパイラはパラメータリストを解決してから、上記の2番目のメソッドである適切なメソッドを呼び出します。
次に、完全なJavaプログラムを実装して、パラメーターのデータ型に基づいてメソッドのオーバーロードを示します。
Windowsでepsファイルを表示する方法
class MethodOverload { //overloaded method - char parameter public void printParam(char ch) { System.out.println('Input character:' + ch); } //overloaded method - int parameter public void printParam(int num) { System.out.println('Input Number:' + num); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A'); //call overloaded method (char ) obj.printParam(10); //call overloaded method (int ) } }
出力:
#2)パラメータの数
メソッドのオーバーロードの別の実装は、関数呼び出しで異なる数のパラメーターを使用してメソッドをオーバーロードすることです。
例えば、次のメソッド宣言について考えてみましょう。
addnum(int、int);
addnum(int、int、int);
上記のメソッド宣言では、最初のメソッド宣言には2つのパラメーターがあり、2番目のメソッド宣言には3つのパラメーターがあります。関数が呼び出されると、コンパイラーはパラメーターの数を検査してから、メソッド呼び出しを適切に解決します。
以下の例は、パラメーターの数に基づいてメソッドのオーバーロードを使用するプログラムを示しています。
class MethodOverload { //overloaded method - 1 parameter public void printParam(char ch) { System.out.println(ch); } //overloaded method - 2 parameters public void printParam(char ch, int num) { System.out.println('Character: ' + ch + ' ; '+ 'Number:' +num); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A'); //call overloaded method (1 ) obj.printParam('A',10); //call overloaded method (2 ) } }
出力:
この例では、パラメーターの数に基づいてオーバーロードされた2つのメソッドがあります。最初の方法は1つのパラメーターを取り、2番目の方法は2つのパラメーターを取ります。 mainメソッドでは、両方のメソッドを次々に呼び出し、コンパイラーは指定されたパラメーターの数に応じて関数呼び出しを解決します。
#3)パラメータのシーケンス
メソッドのオーバーロードを実装する3番目のアプローチは、オーバーロードされたメソッドのパラメーターのシーケンスに基づいています。
次のメソッド宣言の例を考えてみましょう。
sum(int、float);
sum(float、int);
ここに、オーバーロードされたメソッドの合計があります。最初の宣言では、パラメーターはintとfloatです。 2番目の宣言でも、パラメーターはintとfloatですが、パラメーターリストでの順序が変更されています。
これで、floatパラメーターが最初に表示され、intパラメーターが2番目に表示されます。パラメータの順序を変更することで、メソッドのオーバーロードを実現できます。
ザ・ 以下のJavaプログラムはこれを示しています。
class MethodOverload { //overloaded method - char,int parameter public void printParam(char ch, int num) { System.out.println('Input character:' + ch + ' ; ' + 'Input Number:' + num); } //overloaded method - int,char parameter public void printParam(int num, char ch) { System.out.println('Input Number:' + num + ' ; ' + 'Input Character:' + ch); } } class Main { public static void main(String args()) { MethodOverload obj = new MethodOverload(); obj.printParam('A', 100); //call overloaded method (char,int) obj.printParam(100, 'A'); //call overloaded method (int,char) } }
出力:
上記のプログラムには、2つのメソッド宣言で順序が変更されたintパラメーターとcharパラメーターを持つprintParamオーバーロードメソッドがあります。
メソッドのオーバーロードの無効なケース
これまで、パラメータリストを使用したメソッドのオーバーロードについて説明してきました。メソッドの戻り値の型についてはまだ検討していません。戻り値の型に基づいてメソッドをオーバーロードしないことに注意してください。
たとえば、2つのメソッドの名前が同じで、パラメータリストが同じで、戻り値の型が異なる場合、これら2つのメソッドがオーバーロードされているとは言えません。このケースは、オーバーロードに対して無効になります。
したがって、次の宣言がある場合:
I int(int、int);
文字列sum(int、int);
この場合、2つのメソッドがオーバーロードされていないため、コンパイラーはエラーを発行します。したがって、戻り値の型のみに基づいて、メソッドは区別されません。
Javaプログラムを使用して、この無効なケースを示しましょう。
class OverloadDemo { public double myMethod(int num1, int num2) { System.out.println('OverloadDemo::myMethod returns double'); return num1+num2; } public int myMethod(int var1, int var2) { System.out.println('OverloadDemo::myMethod returns int'); return var1-var2; } } class Main { public static void main(String args()) { OverloadDemo obj2= new OverloadDemo(); obj2.myMethod(10,10); obj2.myMethod(20,12); } }
上記のプログラムでは、メソッドmyMethodには2つのプロトタイプがあります。 1つのプロトタイプは2つのintパラメーターを取り、doubleを返します。 2番目のメソッドのプロトタイプは、2つのintパラメーターを受け取り、intを返します。
したがって、このプログラムをコンパイルすると、次の出力が得られます。
出力:
上記のコンパイルエラーは、メソッドが2回宣言されていることを示しています。これは、コンパイラがこれらのメソッドが単に戻り値の型に基づいてオーバーロードされているとは見なさないことを意味します。
演算子のオーバーロード
演算子のオーバーロードは、既存の演算子に異なる意味が与えられるオーバーロードメカニズムです。
このチュートリアルの紹介セクションで説明したように、加算演算子「+」は演算子のオーバーロードの典型的な例です。
この演算子のオペランドが数値の場合、+演算子は合計2つの値を返します。ただし、オペランドが文字列型の場合、加算演算の結果は連結された文字列になります。 Javaでは、オーバーロードできるのは+(加算)演算子のみであることに注意してください。
この演算子は2つの機能を実行します。
- 整数または数値の追加。
- 文字列の連結
したがって、Javaでは、sizeof、dot演算子などを除いて、ほとんどすべての演算子をオーバーロードできるC ++とは異なり、演算子のオーバーロードのサポートが制限されています。
以下のプログラムは、Javaでの演算子のオーバーロードを示しています。
class OperatorOverload { //overloaded method for concatenating two strings void operator(String str1, String str2) { String resultStr = str1 + str2; System.out.println('Concatenated String: ' + resultStr); } //overloaded method for adding two numbers void operator(int num1, int num2) { int result = num1 + num2; System.out.println('Sum of two numbers : ' + result); } } class Main { public static void main(String() args) { OperatorOverload obj = new OperatorOverload(); obj.operator(10, 15); //add two numbers obj.operator('Hello ', 'World!!'); //concatenate two strings } }
出力:
上記のプログラムでは、「+」演算子をオーバーロードしています。オーバーロードされたメソッドに2つの整数値を渡すと、2つの整数の合計が返され、2つの文字列が渡されると、結果は連結された文字列になります。
オーバーロードとコンパイル時のポリモーフィズムに関して注意すべき特定のポイント。
- メソッドのオーバーロードは、静的ポリモーフィズムとも呼ばれるコンパイル時のポリモーフィズムを実装する方法です。
- 静的ポリモーフィズムは、アーリーバインディングまたはコンパイル時バインディングとも呼ばれます。
- パラメータのバインドと関数呼び出しはコンパイル時に行われるため、オーバーロードはコンパイル時のバインドと呼ばれます。
- Javaでは「+」演算子のみをオーバーロードでき、2つの整数の加算または2つの文字列の連結を実行します。
よくある質問
Q#1)Javaでポリモーフィズムが必要なのはなぜですか?
回答: ポリモーフィズムにより、1つのオブジェクトに対して多くの実装を行うことができます。メソッドのオーバーロードにより、覚えにくい異なる名前のメソッドが多すぎる必要はありません。代わりに、メソッドをオーバーロードして、同様の機能を実行するメソッドを明確に実装することができます。
また、オーバーライドは、継承の適切な実装を支援し、既存のクラスに簡単な方法で機能を追加できるようにします。
Q#2)ポリモーフィズムOOPとは何ですか?
回答: ポリモーフィズムのオブジェクト指向プログラミング定義とは、プログラミング言語が1つのオブジェクトをさまざまな形式で実装する機能を指します。ポリモーフィズムは、親クラスから派生クラスへのメソッドをオーバーライドして追加機能を持たせるプログラムの機能としても定義されます。
Q#3)mainメソッドをオーバーロードしてオーバーライドできますか?
回答: いいえ。静的mainメソッドをオーバーライドすることはできません。 mainメソッドをオーバーロードすることはできますが、JVMがオーバーロードされたmainメソッドを呼び出すことはありません。したがって、最良の答えは、mainメソッドをオーバーロードまたはオーバーライドしないことです。
Q#4)コンストラクターはオーバーロードできますか?
oraclesqlインタビューの質問と回答
回答: はい、Javaメソッドをオーバーロードするのと同じ方法で、Javaのコンストラクターをオーバーロードできます。コンストラクターは通常同じ名前ですが、引数の数が異なります。
Q#5)メソッドのオーバーロードが役立つのはなぜですか?
回答: メソッドのオーバーロードを使用してクリーンなコードを記述できます。また、同じ名前のメソッドがあるため、読み取り可能になります。したがって、さまざまなデータ型の機能を実装している場合は、メソッドをオーバーロードでき、コードを簡単に分離できます。
結論
Javaのポリモーフィズムは、オブジェクトが多くの形式を持つことができることを意味します。 Javaのポリモーフィズムには、コンパイル時ポリモーフィズムとランタイムポリモーフィズムの2つのタイプがあります。コンパイル時のポリモーフィズムは、コンパイル時に実行されます。コンパイル時のポリモーフィズムは静的であり、メソッドのオーバーロードと演算子のオーバーロードによって実装されます。
ランタイムポリモーフィズムは実行時に実行され、動的です。これは、メソッドのオーバーライドを使用して実装されます。
このチュートリアルでは、メソッドのオーバーロードを実装する方法を見てきました。また、演算子のオーバーロードについても詳しく説明しました。 Javaは、「+」演算子のオーバーロードのみをサポートします。
=> EasyJavaトレーニングシリーズをお読みください。