English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、多態性、異なる種類の多態性、およびそれらをJavaで実現する方法について例を通じて学びます。
ポリモーフィズムはオブジェクト指向プログラミングの重要な概念です。これは、ただ一つの形があるという意味ではありません。つまり、同じエンティティ(メソッド、演算子またはオブジェクト)が異なる状況で異なる行動を示すという意味です。例えば、
Javaでは、+演算子は特定の二つの機能を実行するために使用されます。数値(整数および浮動小数点数)と一緒に使用される場合、加法演算が行われます。
int a = 5; int b = 6; int sum = a + b; // sum = 11
次のように、+演算子が文字列と一緒に使用される場合、文字列結合が実行されます。例えば、
String firstName = "abc "; String lastName = "xyz"; name = firstName + lastName; // name = abc xyz
Javaでは、ポリモーフィズムは二つの種類に分けられます:
動的ポリモーフィズム
コンパイル時多態性
Javaでは、メソッドのオーバーライドを通じて動的ポリモーフィズムを実現できます。
親クラスおよびその子クラスで同じメソッドが作成された場合、呼び出されたメソッドはそのメソッドを呼び出したオブジェクトに依存します。例えば、
abstract class Animal { public abstract void makeSound(); } class Dog extends Animal { @Override public void makeSound() { System.out.println("Bark bark.."); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("Meow meow.."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.makeSound(); Cat c1 = new Cat(); c1.makeSound(); } }
出力:
Bark bark… Meow-meow...
メソッドオーバーライドの動作原理を理解するには、Javaでのメソッドオーバーライド。
上記の例では、该方法makeSound()は二つの異なるクラスで異なる実装を持っています。プログラムを実行するときに
表現d1.makeSound()はDogクラスのメソッドを呼び出します。これはd1はDogクラスのオブジェクトです。
表現c1.makeSound()はCatクラスのメソッドを呼び出します。これはc1はCatクラスのオブジェクトです。
プログラムの実行中に呼び出すべきメソッドを決定します。したがって、メソッドオーバーライドはランタイム多態性です。
Javaでのメソッドオーバーロードとオペラトアオーバーロードを使用して、コンパイル時多態性を実現できます。
Javaのクラスでは、引数が異なる場合、同じ名前でメソッドを作成できます。例えば、
void func() { ... } void func(int a) { ... } float func(double a) { ... } float func(int a, float b) { ... }
これはJavaではメソッドオーバーロードと呼ばれます。
メソッドオーバーロードの例として見てみましょう。
class Demo { public void displayPattern(){ for(int i = 0; i < 10; i++) { System.out.print("*"); } } public void displayPattern(char symbol) { for(int i = 0; i < 10; i++) { System.out.print(symbol); } } } class Main { public static void main(String[] args) { Demo d1 = new Demo(); d1.displayPattern(); System.out.println("\n"); d1.displayPattern('#'); } }
出力:
********** ##########
上記のプログラムでは、displayPattern()メソッドがオーバーロードされています
もし何もパラメータを渡さずにこのメソッドを呼び出した場合、それが作成されます * 文字のパターン。
このメソッドを文字列引数として呼び出すと、#文字のパターンが作成されます。
メソッド重载に関する詳細情報を取得するには、以下のURLにアクセスしてくださいメソッド重载
メソッドのオーバーライドの場合、メソッドは異なるクラスに存在する必要があります。しかし、メソッドのオーバーロードの場合、メソッドは同じクラスに存在する必要があります。
メソッドのオーバーライドは実行時に行われ、メソッドのオーバーロードはコンパイル時に行われます。
Javaの特定の演算子は異なる操作数に対して異なる動作をします。例えば、
+ 演算子は数字の加法および文字列結合を実行するためにオーバーロードされます。
&、|、!が論理およびビット演算のオーバーロードに使用されます。
Javaで演算子のオーバーロードがどのように機能するかを見てみましょう。
Javaでは、+演算子は特定の機能を実行するために使用されます。数字(整数および浮点数)と一緒に使用される場合、加法演算が実行されます。例えば、
int a = 5; int b = 6; int sum = a + b; // sum = 11
次のように、+演算子が文字列と一緒に使用される場合、文字列結合が実行されます。例えば、
String firstName = "abc "; String lastName = "xyz"; name = firstName + lastName; // name = abc xyz
C ++このような言語では、異なる操作数に対して異なる処理を行うための演算子を定義できますが、Javaはユーザー定義の演算子オーバーロードをサポートしていません。
ポリモーフィズムにより、一貫したコードを作成できます。例えば、
円と正方形を描画する必要がある場合、Polygonクラスを作成し、Circleとsquareがその2つのサブクラスを継承します。この場合、異なる名前のメソッドを作成するのではなく、同じ名前のrender()メソッドを両方のサブクラスに作成する必要があります。
私たちのメソッドオーバーロードの例では、一貫性を保つために同じメソッド名displayPattern()を使用して、異なるパターンを表示しています。
Javaのprint()メソッドもポリモーフィズム(メソッドオーバーロード)の例です。同じメソッドが異なるデータ型の値、例えばchar、int、Stringなどに適用されます。また、同じメソッドを使用して複数の値を一度に印刷することもできます。
Javaでは、オブジェクト変数(インスタンス変数)はポリモーフィズムの行動を表す。これは、クラスのオブジェクト変数がそのクラスのオブジェクトおよびそのサブクラスのオブジェクトを参照できるためです。例えば、
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { @Override public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { //Animalクラスのオブジェクト変数aの宣言1 Animal a1; //Animalクラスのオブジェクトの作成 a1 = new Animal(); a1.displayInfo(); //dogクラスのオブジェクトの作成 a1 = new Dog(); a1.displayInfo(); } }
出力:
I am an animal. I am a dog.
上記の例では、Animalクラスのオブジェクト変数aを生成しました。1。ここでは、a1はポリモーフィック変数です。
これは、
文の a1 = new Animal(),a1Animalクラスを参照するオブジェクト。
文の a1 = new Dog(),a1Dogクラスを参照するオブジェクト。
これはJavaでの向上変換の例です。もっと詳しく知りたい場合は、以下のURLにアクセスしてください。Javaの向上変換と向下変換。