Java ポリモーフィズム
Java ポリモーフィズム
このチュートリアルでは、例を使って Java ポリモーフィズムとその実装について学びます。
ポリモーフィズムは、オブジェクト指向プログラミングの重要な概念です。単純に、複数のフォームを意味します。
つまり、同じエンティティ (メソッド、演算子、またはオブジェクト) が、さまざまなシナリオでさまざまな操作を実行できます。
例:Java ポリモーフィズム
class Polygon {
// method to render a shape
public void render() {
System.out.println("Rendering Polygon...");
}
}
class Square extends Polygon {
// renders Square
public void render() {
System.out.println("Rendering Square...");
}
}
class Circle extends Polygon {
// renders circle
public void render() {
System.out.println("Rendering Circle...");
}
}
class Main {
public static void main(String[] args) {
// create an object of Square
Square s1 = new Square();
s1.render();
// create an object of Circle
Circle c1 = new Circle();
c1.render();
}
}
出力
Rendering Square... Rendering Circle...
上記の例では、スーパークラス Polygon を作成しました。 および 2 つのサブクラス:Square と サークル . render()
の使用に注意してください メソッド。
render()
の主な目的 メソッドは、形状をレンダリングすることです。ただし、正方形をレンダリングするプロセスは、円をレンダリングするプロセスとは異なります。
したがって、render()
メソッドは、異なるクラスで異なる動作をします。または、render()
と言うことができます
ポリモーフィズムの理由
ポリモーフィズムにより、一貫したコードを作成できます。前の例では、さまざまなメソッドを作成することもできます:renderSquare()
および renderCircle()
Square をレンダリングする と サークル 、それぞれ。
これは完全に機能します。ただし、形状ごとに異なるメソッドを作成する必要があります。コードに一貫性がなくなります。
これを解決するために、Java のポリモーフィズムにより、単一のメソッド render()
を作成できます。 形状によって動作が異なります。
注意 :print()
メソッドもポリモーフィズムの一例です。 char
のようなさまざまなタイプの値を出力するために使用されます 、 int
、 string
など
次の方法を使用して、Java でポリモーフィズムを実現できます。
<オール>Java メソッドのオーバーライド
Java での継承時に、スーパークラスとサブクラスの両方に同じメソッドが存在する場合。次に、サブクラスのメソッドがスーパークラスの同じメソッドをオーバーライドします。これはメソッドのオーバーライドと呼ばれます。
この場合、同じメソッドがスーパークラスで 1 つの操作を実行し、サブクラスで別の操作を実行します。たとえば、
例 1:メソッドのオーバーライドを使用したポリモーフィズム
class Language {
public void displayInfo() {
System.out.println("Common English Language");
}
}
class Java extends Language {
@Override
public void displayInfo() {
System.out.println("Java Programming Language");
}
}
class Main {
public static void main(String[] args) {
// create an object of Java class
Java j1 = new Java();
j1.displayInfo();
// create an object of Language class
Language l1 = new Language();
l1.displayInfo();
}
}
出力 :
Java Programming Language Common English Language
上記の例では、Language という名前のスーパークラスを作成しました。 Java という名前のサブクラス .ここでは、メソッド displayInfo()
両方の言語に存在します と Java .
displayInfo()
の使用 情報を印刷することです。ただし、Language で異なる情報を出力しています と Java .
メソッドの呼び出しに使用されるオブジェクトに基づいて、対応する情報が出力されます。
<図>注意 :呼び出されるメソッドは、プログラムの実行中に決定されます。したがって、メソッドのオーバーライドはランタイム ポリモーフィズムです。 .
2. Java メソッドのオーバーロード
Java クラスでは、パラメーターが異なる場合、同じ名前のメソッドを作成できます。たとえば、
void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }
これは、Java ではメソッドのオーバーロードとして知られています。ここでは、同じメソッドがパラメーターに基づいて異なる操作を実行します。
例 3:メソッドのオーバーロードを使用したポリモーフィズム
class Pattern {
// method without parameter
public void display() {
for (int i = 0; i < 10; i++) {
System.out.print("*");
}
}
// method with single parameter
public void display(char symbol) {
for (int i = 0; i < 10; i++) {
System.out.print(symbol);
}
}
}
class Main {
public static void main(String[] args) {
Pattern d1 = new Pattern();
// call method without any argument
d1.display();
System.out.println("\n");
// call method with a single argument
d1.display('#');
}
}
出力 :
********** ##########
上記の例では、Pattern という名前のクラスを作成しました。 .クラスには display()
という名前のメソッドが含まれています
// method with no arguments
display() {...}
// method with a single char type argument
display(char symbol) {...}
ここで、display()
の主な機能 パターンを印刷することです。ただし、渡された引数に基づいて、メソッドは異なる操作を実行しています:
*
のパターンを出力します 、引数が渡されない場合、または- 単一の
char
の場合、パラメータのパターンを出力します 型引数が渡されます。
注意 :呼び出されるメソッドは、コンパイラによって決定されます。そのため、コンパイル時ポリモーフィズムとも呼ばれます。
3. Java 演算子のオーバーロード
Java の一部の演算子は、オペランドが異なると動作が異なります。たとえば、
+
演算子は、数値の加算と文字列の連結を実行するためにオーバーロードされています。&
のような演算子 、|
、および!
論理演算とビット演算のためにオーバーロードされています。
演算子のオーバーロードを使用してポリモーフィズムを実現する方法を見てみましょう。
+
演算子は、2 つのエンティティを追加するために使用されます。ただし、Java では +
オペレーターは 2 つの操作を実行します。
1. +
の場合 を数値 (整数および浮動小数点数) と共に使用すると、数学的な加算が実行されます。たとえば、
int a = 5;
int b = 6;
// + with numbers
int sum = a + b; // Output = 11
2. +
を使用する場合 演算子を文字列で使用すると、文字列連結 (2 つの文字列を結合) が実行されます。たとえば、
String first = "Java ";
String second = "Programming";
// + with strings
name = first + second; // Output = Java Programming
ここで、+
が 演算子は Java でオーバーロードされ、加算 の 2 つの操作を実行します。 と連結 .
注意 :C++ のような言語では、オペランドごとに異なる動作をする演算子を定義できます。ただし、Java はユーザー定義の演算子のオーバーロードをサポートしていません。
多態的な変数
変数は、異なる条件下で異なる値を参照する場合、ポリモーフィックと呼ばれます。
オブジェクト変数 (インスタンス変数) は、Java におけるポリモーフィック変数の動作を表します。これは、クラスのオブジェクト変数が、そのクラスのオブジェクトだけでなく、そのサブクラスのオブジェクトも参照できるためです。
例:ポリモーフィック変数
class ProgrammingLanguage {
public void display() {
System.out.println("I am Programming Language.");
}
}
class Java extends ProgrammingLanguage {
@Override
public void display() {
System.out.println("I am Object-Oriented Programming Language.");
}
}
class Main {
public static void main(String[] args) {
// declare an object variable
ProgrammingLanguage pl;
// create object of ProgrammingLanguage
pl = new ProgrammingLanguage();
pl.display();
// create object of Java class
pl = new Java();
pl.display();
}
}
出力 :
I am Programming Language. I am Object-Oriented Programming Language.
上記の例では、オブジェクト変数 pl を作成しました。 プログラミング言語の クラス。では、お願い 多相変数です。これは、
- ステートメント
pl = new ProgrammingLanguage()
内 、pl ProgrammingLanguage のオブジェクトを参照 クラス。 - そして、ステートメント
pl = new Java()
で 、pl Java のオブジェクトを参照 クラス。
これは Java でのアップキャストの例です。
Java