Java におけるポリモーフィズムと動的バインディング
出典: DZone ポリモーフィズムは、オブジェクト指向プログラミングの中核概念の 1 つです。Java プログラミングの初心者でも、経験豊富な開発者でも、ポリモーフィズムとは何か、そしてそれがどのように機能するかを知っておく必要があります。ほとんどの開発者はこのトピックに精通していると主張しますが、静的バインディングや動的バインディングなどの他の複雑な機能になると、多くの開発者は自信を失います。Javaのポリモーフィズムとは何ですか?
ポリモーフィズムとは、多くの形式を持つことを意味します。プログラミングでは、これは信号またはメッセージが複数の形式で表示される機能を指します。実際の例
人は同時に多くの特性を示すことができます。たとえば、母親は同時に妻、娘、姉妹、会社員などになることができます。したがって、人は異なる条件下では異なる特性を示す可能性があります。これはポリモーフィズムとして知られています。ポリモーフィズムの重要性
ポリモーフィズムは、オブジェクト指向プログラミング言語 (Java など) の最も重要な機能の 1 つです。ポリモーフィズムを利用すると、同じタスクをさまざまな方法で実行できます。ポリモーフィズムの種類
Java では、ポリモーフィズムは 2 つのカテゴリに分類できます。- コンパイル時のポリモーフィズム (静的リンク)
- ランタイムポリモーフィズム (ランタイム、動的バインディング)
コンパイル時のポリモーフィズム
コンパイル時のポリモーフィズムは、静的リンクとも呼ばれます。このタイプの多態性は、関数のオーバーロードまたは演算子のオーバーロードを通じて実現できます。ただし、Java では演算子のオーバーロードがサポートされていないため、これは関数のオーバーロードに限定されます。 関数のオーバーロード 同じ関数名を持つ関数またはメソッドが少なくとも 2 つあり、それらに含まれるパラメーターの数が異なるか、対応するパラメーターの少なくとも 1 つのデータ型が異なる (またはその両方) 場合、それは関数と呼ばれます。またはメソッドのオーバーロードであり、これらの関数はオーバーロード関数として知られています。 例 1 これまで、関数のオーバーロードとは何かについて説明してきました。次に、ソフトウェア関数のオーバーロードを実証してみましょう。class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Returns sum of integer numbers
return a + b;
}
// Method 2
// having the same name but with 2 double parameters
static double Addition(double a, double b)
{
// Returns sum of double numbers
return a + b;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(12, 14));
System.out.println(Addition(15.2, 16.1));
}
}
上記のプログラムはここで実行できます。 プログラムの説明:
-
上記のプログラムは、同じ名前を持つ 2 つの静的関数Additionで構成されています。
-
ここで、両方の関数には同じ数のパラメータが含まれていますが、対応するパラメータは異なります。
-
メソッド 1 は2 つの整数パラメータを受け入れますが、メソッド 2 は2 つのdoubleパラメータを受け入れます。
-
main 関数から、最初にAddition(12, 14)関数を呼び出します。渡されるパラメータは整数 (12 および 14) であるため、ここではメソッド 1が呼び出されます。
-
次に、 Addition(15.2, 16.1)関数を呼び出しました。渡されたパラメーターは double データ型 (15.2 および 16.1) であるため、今回はメソッド 2が呼び出されます。
-
これは、さまざまなパラメーター データ型に基づいて Java で関数のオーバーロードを実現する方法です。
class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Returns sum of integer numbers
return a + b;
}
// Method 2
// having the same name but with 3 integer parameters
static double Addition(double a, double b)
{
// Returns sum of integer numbers
return a + b;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(12, 14));
System.out.println(Addition(15.2, 16.1));
}
}
上記のプログラムはここで実行できます。 プログラムの説明:
-
上記のプログラムは、同じ名前を持つ 2 つの静的関数Additionで構成されています。
-
ここで、両方の関数に含まれるパラメータの数は異なりますが、最初の 2 つの対応するパラメータのデータ型は同じ (整数) です。
-
メソッド 1は 2 つの整数パラメータを受け取り、メソッド 2 は3 つの整数データ型パラメータを受け取ります。
-
main 関数から、最初にAddition(2, 3)関数を呼び出します。渡されたパラメータは整数 (2 と 3) であるため、ここでメソッド 1を呼び出します。
-
次に、 Addition(4, 5, 6)関数を呼び出しました。渡されるパラメーターは double データ型 (4、5、6) であるため、今回はメソッド 2を呼び出します。
-
これは、さまざまな数のパラメーターに基づいて Java で関数がオーバーロードされる方法です。
class Main {
// Method 1
// Method with 2 integer parameters
static int Addition(int a, int b)
{
// Return the sum
return a + b;
}
// Method 2
// having the same name but with 3 parameters
// 1st parameter is of type double and other parameters
// are of type integer
static double Addition(double a, int b, int c)
{
// Return the sum
return a + b + c;
}
public static void main(String args[]) {
// Calling method by passing
// input as in arguments
System.out.println(Addition(2, 4));
System.out.println(Addition(4.2, 6, 10));
}
}
上記のプログラムはここで実行できます。 プログラムの説明:
-
上記のプログラムは、同じ名前を持つ 2 つの静的関数Additionで構成されています。
-
どちらの関数にも異なる数のパラメータが含まれており、最初に対応する要素のデータ型も異なります。
-
メソッド 1 は2 つの整数パラメータを受け取りますが、メソッド 2 は3 つのパラメータを受け取ります。最初のパラメータは double 型で、他の 2 つは整数データ型です。
-
main 関数から、最初にAddition(2, 4)関数を呼び出します。渡されたパラメータは整数 (2 と 4) であるため、ここでメソッド 1を呼び出します。
-
次に、 Addition(4.2, 6, 10)関数を呼び出しました。渡される最初のパラメータは整数型で、残りのパラメータはdouble (4.2, 6, 10) データ型であるため、今回はメソッド 2が呼び出されます。
-
このようにして、Java は、さまざまな数のパラメータと、対応するパラメータのさまざまなデータ型に基づいて関数のオーバーロードを実現します。
ランタイムポリモーフィズム
このオプションは動的リンクとも呼ばれます。このプロセスでは、別の関数用に作成された関数の呼び出しは実行時にのみ許可されます。Java ではメソッドのオーバーライドを使用して動的バインディングを実現できます。メソッドのオーバーライド
Java でのメソッドのオーバーライドは、基本クラスのメソッドが派生クラスに定義を持つ場合に発生します。基本クラスのメソッドまたは関数は、オーバーライドされたメソッドと呼ばれます。// Class 1
class Parent {
// Print method
void Print()
{
// Print statement
System.out.println("Inside Parent Class");
}
}
// Class 2
class Child1 extends Parent {
// Print method
void Print() { System.out.println("Inside Child1 Class"); }
}
// Class 3
class Child2 extends Parent {
// Print method
void Print()
{
// Print statement
System.out.println("Inside Child2 Class");
}
}
class Main {
public static void main(String args[]) {
// Creating an object of class Parent
Parent parent = new Parent();
parent.Print();
// Calling print methods
parent = new Child1();
parent.Print();
parent = new Child2();
parent.Print();
}
}
上記のプログラムはここで実行できます。 プログラムの説明:
-
上記のプログラムは、Parent (クラス 1 )、Child1 (クラス 2 )、Child2 (クラス 3 ) の 3 つのクラスで構成されています。クラス 2とクラス 3 はクラス 1を継承します。
-
親にはPrint()というメソッドがあります。この関数内で「Inside Parent Class」を出力します。Child1とChild2 にはPrint()関数もあります。これは基本的にParentクラスのPrint()関数をオーバーライドし、それぞれ「Inside Child1 Class」と「Inside Child2 Class」をコンソールに出力します。
-
main 関数から、まず、parent と呼ばれる親クラスのオブジェクトを作成します。次に、このオブジェクトを使用して、親クラスの print メソッドを呼び出します。したがって、コンソールには「Inside Parent Class 」と表示されます。
-
その後、Child1クラスのデフォルトのコンストラクターを呼び出し、 Print()関数を呼び出します。親クラスのPrint()メソッドをオーバーライドしたため、Child1クラスで定義されたPrint()メソッドが呼び出されることに注意してください。したがって、コンソールには「 Inside Child1 Class 」と表示されます。
-
最後に、 Child2クラスのデフォルトのコンストラクターを呼び出し、 Print()関数を呼び出します。ここでは、親クラスのPrint()メソッドをオーバーライドしたため、Child2クラスで定義されたPrint()メソッドが呼び出されます。したがって、コンソールには「 Inside Child2 Class 」と表示されます。
-
これは、Java でメソッドのオーバーライドが実現される方法です。
結果
この記事では、Java におけるポリモーフィズムとは何かを学びました。次に、このトピックをさらに深く掘り下げ、Java の 2 つのタイプのポリモーフィズム、コンパイル時ポリモーフィズムと実行時ポリモーフィズムについて説明しました。Java で静的バインディングと動的バインディングをどのように実現できるかをプログラムを通じて実証しました。Java の for ループ + forEach ループの構文例
出典: FreeCodeCamp プログラミングにおけるループとは、特定の条件が満たされるまで継続的に実行される一連の命令です。この記事では、 Java の for ループとforEachループについて学びます。Java の For ループ構文
forループを作成するための構文は次のとおりです。for (initialization; condition; increment/decrement) {
// code to be executed
}
コード内のキーワードのいくつかを見てみましょう。
-
for は、ループを作成することを示します。その後に括弧が続き、ループを機能させるために必要なものがすべて含まれています。
-
初期化では、ループの開始点として初期変数 (通常は整数) を定義します。
-
条件はループを何回実行するかを指定します。
-
インクリメント/デクリメントは、ループが実行されるたびに初期変数の値をインクリメント / デクリメントします。変数の値が増加/減少すると、指定された条件に向かう傾向があります。
-
各キーワードはセミコロン ( ; ) で区切られていることに注意してください。
for(int x = 1; x <=5; x++) {
System.out.println(x);
}
/*
1
2
3
4
5
*/
上の例では、開始変数は値 1 のxです。x の値が 5 以下である限り、ループは実行され続けます。これが条件です。x++ は実行のたびにxの値をインクリメントします。xの値を出力し続けましたが、条件が満たされたため 5 で停止しました。6 に増やすことは、5 以上であり、5 に等しくないため不可能です。次の例では、forループを使用して配列内のすべての値を出力します。
int[] randomNumbers = {2, 5, 4, 7};
for (int i = 0; i < randomNumbers.length; i++) {
System.out.println(randomNumbers[i]);
}
// 2
// 5
// 4
// 7
これは最後の例とほぼ同じです。ここでは、配列の長さを条件として使用し、配列の最初の要素の序数が 0 であるため、変数の初期値を 0 として使用しています。
Java の forEach ループ構文
forEachループは、配列の要素を反復処理するために特に使用されます。その構文は次のようになります。for (dataType variableName : arrayName) {
// code to be executed
}
ここの構文はforループ よりも短いことがわかります。そして、forEachループもforキーワードで始まります。変数を値で初期化する代わりに、最初にデータ型を指定します(配列のデータ型と一致する必要があります)。この後に変数の名前と配列の名前がコロンで区切られて続きます。構文をより深く理解するのに役立つ例を次に示します。
int[] randomNumbers = {2, 5, 4, 7};
for (int x : randomNumbers) {
System.out.println(x + 1);
}
/*
3
6
5
8
*/
この例では、各要素を反復処理し、その初期値を 1 ずつ増加させました。デフォルトでは、ループは配列のすべての要素を反復処理すると停止します。これは、変数に値を渡したり、ループを終了するための条件を指定したりする必要がないことを意味します。
GO TO FULL VERSION