java override method overriding
このチュートリアルでは、メソッドのオーバーライドと@overrideアノテーションを使用してJavaでランタイムポリモーフィズムを実現する方法を簡単な例で説明します。
ポリモーフィズムの概念とコンパイル時のポリモーフィズムについては、すでに詳しく説明しました。このチュートリアルでは、Javaでのランタイムポリモーフィズムについて説明します。
メソッド呼び出しがコンパイル時に解決されるコンパイル時ポリモーフィズムとは対照的に、実行時ポリモーフィズムでは、メソッド呼び出しは実行時に解決されます。
=> ここですべてのJavaチュートリアルを確認してください。
学習内容:
Javaでのランタイムポリモーフィズム
としても知られているランタイムポリモーフィズム 動的ポリモーフィズム または 動的メソッドディスパッチ は オーバーライドされたメソッド呼び出しが実行時に動的に解決される手法。
Javaのランタイムポリモーフィズムは、「 メソッドのオーバーライド 」。メソッドのオーバーライドは、親クラスのメソッドを子クラスで再定義またはオーバーライドする手法です。
メソッドがクラスでオーバーライドされると、動的メソッドディスパッチ手法は、コンパイル時ではなく実行時にオーバーライドされたメソッド呼び出しを解決します。
Javaでランタイムポリモーフィズムを実現–メソッドのオーバーライド
メソッドのオーバーライドは、Javaでランタイムポリモーフィズムを実現するために使用するアプローチです。 すでに述べたように、メソッドのオーバーライドは、サブクラスがその親クラスにすでに存在するメソッドを追加し、このメソッドに新しい機能を追加する手法です。次に、基本クラスのメソッドがオーバーライドされると言います。
親クラスのメソッドと同じプロトタイプでサブクラスに定義した新しいメソッドですが、実装が異なります。 オーバーライドメソッド」 。親クラスのメソッドは「 オーバーライドされたメソッド 」。
30分より長いmp3へのyoutube
メソッドがオーバーライドされると、このオーバーライドされたメソッドの呼び出しがどのように解決されるかという疑問が残ります。
通常、オーバーライドされたメソッドは、基本クラスの参照を介して呼び出されます。タイプbaseの参照を作成してから、newキーワードを使用して子クラスオブジェクトを割り当てます。
したがって、参照変数の内容、または呼び出されるメソッドを決定する基本クラス参照によって参照されるオブジェクトによって異なります。したがって、参照オブジェクトが子クラスのオブジェクトを指している場合、オーバーライドするメソッドが呼び出されます。
それ以外の場合、参照オブジェクトに基本クラスオブジェクトが含まれていると、オーバーライドされたメソッドが呼び出されます。特に動的メソッドディスパッチの実行時ポリモーフィズムで明確にする必要があるトピックの1つは、以下で説明する「アップキャスティング」です。
アップキャスティング
上で説明した親クラスの参照オブジェクトがサブクラスのオブジェクトを指している、または参照している場合、それをアップキャスティングと呼びます。
簡単な例を使用してアップキャストを理解しましょう。
クラス「BaseClass」があり、このBaseClassを拡張して新しいクラスDerivedClassを作成するとします。この構造は次のようになります。
class BaseClass { ….//BaseClass code here } class DerivedClass extends BaseClass{ ….//DerivedClass code here }
アップキャストを実装するために、BaseClass型の参照変数を宣言します。次に、以下のコードステートメントで行うように、DerivedClassのオブジェクトをクラスBaseClassの参照に割り当てます。
BaseClass base = new DerivedClass (); //Upcasting
したがって、ここでは、DerivedClassオブジェクトをBaseClassにアップキャストしたと言えます。ランタイムポリモーフィズムに関する限り、アップキャストの概念は非常に重要です。
したがって、一般に、アップキャストは、子オブジェクトまたはサブクラスオブジェクトを親クラスまたはスーパークラスの参照に割り当てるプロセスです。
SuperClass reference = new Subclass Object;
以下のJavaプログラムは、メソッドのオーバーライドを示し、実行時にオーバーライドされたメソッド呼び出しを解決するためにアップキャストがどのように実行されるかを示しています。
//base/parent class class Parent { void Print() //print method { System.out.println('Parent::Print() method'); } } //child class 1 inheriting from Parent class child1 extends Parent { void Print() //overridden print method { System.out.println('child1::Print() method'); } } //child class 2 inheriting from Parent class child2 extends Parent { void Print() //overridden print method { System.out.println('child2::Print() method'); } } class Main { public static void main(String() args) { Parent parent = new Parent(); parent.Print(); //executes parent Print () method parent = new child1(); //upcasting parent.Print(); //executes child1 Print () method parent = new child2(); //upcasting parent.Print(); //executes child2 Print () method
出力:
上記のプログラムには、2つのクラス、つまり、両方とも「親」クラスから派生したchild1とchild2があります。親クラスには、child1クラスとchild2クラスの両方でオーバーライドされるメソッド「Print」があります。次に、mainメソッドで、「parent」という名前のParentクラスの参照オブジェクトを作成します。
まず、Parentクラスのオブジェクトを割り当ててから、「Print()」メソッドを呼び出します。次に、最初にchild1オブジェクトを割り当て、次にchild2オブジェクトをParent参照に割り当てることで、これを繰り返します。
charをintc ++にキャストします
親参照の内容に応じて出力が表示され、適切なPrintメソッドが呼び出されます。
動的/実行時ポリモーフィズムの利点
- 動的ポリモーフィズムを使用すると、プログラマーはメソッドをオーバーライドできます。
- これにより、クラスは一般的な実装でメソッドを定義し、その派生物をオーバーライドして特定の実装を提供できます。
- 動的メソッドディスパッチでは、コンパイル時に決定されるオーバーロードとは異なり、メソッド呼び出しは実行時に解決されます。これにより、プログラマーの柔軟性が高まります。
ランタイムポリモーフィズムは、実行時に適切なメソッドを呼び出しにバインドし、それを呼び出します。 動的バインディングまたは遅延バインディング 。一方、コンパイル時のポリモーフィズムはサポートします 静的バインディングまたは早期バインディング 。
静的バインディングと動的バインディング
静的バインディング | 動的バインディング |
---|---|
コンパイル時に解決されるメソッド呼び出しは静的バインディングです。 | 実行時に解決されるメソッド呼び出しは動的バインディングです。 |
メソッドのオーバーロードは静的バインディングの例です。 | メソッドのオーバーライドは、動的バインディングの例です。 |
クラスタイプとフィールドタイプは静的バインディングに使用されます。 | オブジェクトは動的バインディングに使用されます。 |
プライベート、ファイナル、静的エンティティは静的バインディングを使用します。 | 仮想メソッドは動的バインディングを使用します。 |
Javaの仮想関数/メソッド
Javaの仮想関数またはメソッドは、ランタイムポリモーフィズムで使用される機能です。 C ++とは異なり、 Javaには特別な「仮想」キーワードはありません メソッドが仮想であることを示します。基本クラスで定義され、派生クラスでオーバーライドされるメソッドは仮想です。
Javaでは、デフォルトで、privateとfinalを除くすべての非静的メソッドは仮想関数です。したがって、ランタイムポリモーフィズムを実装するためにオーバーライドする上記のメソッドも仮想メソッドであることに注意してください。
静的メソッドはClassにバインドされており、オブジェクトを使用して呼び出すことはできないため、ランタイムポリモーフィズムでは使用できず、仮想関数でもありません。
Javaのインターフェースはデフォルトで仮想です。インターフェイスを実装するクラスは、インターフェイスメソッドの実装を提供します。実行時ポリモーフィズムと同様に、インターフェイスメソッドの呼び出しも実行時に解決されます。
インターフェイスのメソッドはオーバーライドされるように設計されているため、すべてのインターフェイスメソッドは仮想関数であることに注意してください。
たとえば、次のコードについて考えてみます。
interface car{ void accelerate(); } class Maruti implements car{ void accelerate () { System.out.println(“Maruti car accelerated!!”); } }
上記のコードでは、メソッドaccelate()は、インターフェイスカーの一部であり、オーバーライドされるように設計されているため、仮想関数です。
Javaでの@overrideアノテーション
@overrideアノテーションは、Javaのデフォルトのアノテーションです。このアノテーションはJava1.5で導入されました。 @overrideアノテーションは、サブクラスメソッドがそのスーパークラスメソッドをオーバーライドするときに使用されます。
Java @overrideアノテーションを使用して、メソッドがその親クラスメソッドをオーバーライドしていることを示すことにより、アノテーションが付けられたメソッドがオーバーライドされない場合、コンパイラーは警告を発行します。そのため、@ overrideアノテーションが使用されている場合は、メソッドをオーバーライドする必要があります。
次に、@ overrideアノテーションを使用して、コードを読みやすくします。宣言されているメソッドがオーバーライドされることにすぐに気付くことができます。
Javaの@overrideアノテーションの一般的な構文は次のとおりです。
public @interface override
以下のJavaプログラムは、@ overrideアノテーションの使用法を示しています。
//base class definition class BaseClass { public void display() { System.out.println('BaseClass::display () method'); } } //derived class inheriting base class class DerivedClass extends BaseClass { @Override //indicates the display method being overridden public void display() { System.out.println('DerivedClass::display () method'); } } // main class public class Main { public static void main(String args()) { System.out.println('@Override Example'); //BaseClass type object;contain child object BaseClass testObj = new DerivedClass(); //call display method based on contents of object i.e. derived class display () testObj.display(); } }
出力:
上記のプログラムには、表示メソッドを定義するBaseClassがあります。次に、このBaseClassからクラスDerivedClassを派生させ、表示メソッドに@overrideアノテーションを付けます。このメソッドは、DerivedClassでオーバーライドされます。
mainメソッドで、BaseClassオブジェクト参照を作成し、それをDerivedClassオブジェクトにポイントします。これにより、参照はDerivedClass表示メソッドを呼び出します。
Derivedクラスにdisplay()メソッドを実装していなかった場合、@ overrideアノテーションでマークされているため、コンパイラーはコンパイラーに警告を出します。
Javaでのオーバーロードとオーバーライド
Javaでのオーバーロードとオーバーライドの両方について説明したので、これら2つの概念を要約しましょう。
オーバーロードはコンパイル時のポリモーフィズムに関連しています。つまり、オーバーロードを使用してコンパイル時のポリモーフィズムを実装します。オーバーロードは、メソッドのオーバーロードと演算子のオーバーロードの2つの方法で行われます。
メソッドのオーバーロードは、同じ名前でパラメーターリストが異なる複数のメソッドがある手法です。パラメータリストは、パラメータの数、パラメータのタイプ、またはパラメータのシーケンスに基づいて区別されます。
Javaでの演算子のオーバーロードは制限されており、2つの数値を追加して2つのStringオブジェクトを連結するために使用される「+」演算子のみをオーバーロードできます。
オーバーロードはコンパイル時に解決され、静的です。とも呼ばれます 「早期拘束」 。
メソッドのオーバーライドは、ランタイムポリモーフィズムを実装するために使用する機能です。メソッドのオーバーライドでは、親クラスのメソッドが子クラスでオーバーライドされます。これは、スーパークラスとサブクラスの両方のメソッドプロトタイプは同じままですが、実装が異なることを意味します。
メソッドのオーバーライドでは、動的メソッドディスパッチ手法を使用してメソッド呼び出しを解決し、スーパークラスメソッドとサブクラスメソッドのどちらを呼び出すかを決定します。これは実行時に行われます。
したがって、ランタイムポリモーフィズムは動的ポリモーフィズムまたは遅延バインディングとも呼ばれます。
次に、Javaでのオーバーロードとオーバーライドの違いを表にまとめましょう。
Javaでのオーバーロードとオーバーライド
オーバーロード | オーバーライド |
---|---|
オーバーロードは、コンパイル時のポリモーフィズムで使用されます。 | オーバーライドは、ランタイムポリモーフィズムで実装されます。 |
同じクラスで行うことができます。継承が必要な場合と不要な場合があります。 | オーバーライドには常に継承が必要です。 |
メソッドは、同じメソッド名と異なるパラメーターリストでオーバーロードされます。 | オーバーライドされたメソッドのプロトタイプは同じです。 |
メソッドのオーバーロードでは、戻り値の型は考慮されません。 | 戻り値の型は、オーバーライドされたメソッドとオーバーライドされたメソッドで同じである必要があります。 |
プログラムの読みやすさを向上させます。 | オーバーライドすると、特定の実装クラスを賢く持つことができます。 |
よくある質問
Q#1)静的メソッドをオーバーライドできますか?
回答: いいえ。Javaでは静的メソッドをオーバーライドできません。これは、静的メソッドがクラスベースであり、クラスによって直接呼び出されるためです。実行時に呼び出すオブジェクトは必要ありません。したがって、静的メソッドのディスパッチはコンパイラーによって決定されます。
Q#2)コンストラクターをオーバーライドできますか?
回答: いいえ、コンストラクターをオーバーライドすることはできません。オブジェクトが作成されると、コンストラクターが呼び出されます。オブジェクトとは呼ばれません。また、オーバーライドの要件の1つはオーバーライドされたメソッドであり、オーバーライドするメソッドは、コンストラクターの場合には不可能な同じメソッドシグネチャを持つ必要があります。
Q#3)メソッドのオーバーライドが動的ポリモーフィズムと呼ばれるのはなぜですか?
回答: メソッドのオーバーライドの場合、メソッド呼び出しは実行時に動的に解決されます。したがって、それは動的ポリモーフィズムと呼ばれます。
Q#4)Javaでの動的ポリモーフィズムの使用は何ですか?
回答: 動的ポリモーフィズムは、メソッドのオーバーライドをサポートする動的メソッドディスパッチ手法を使用して、サブクラスがオーバーライドされたメソッドに特定の実装を提供できるようにします。このようにして、効率的なプログラムを作成できるようにする特定の機能を実装できます。
最高の無料のPCクリーナーとオプティマイザー
次に、動的メソッドディスパッチが呼び出すメソッドを決定するため、メソッド呼び出しの解決についても心配する必要はありません。
Q#5)静的バインディングと動的バインディングの違いは何ですか?
回答: メソッド呼び出しとその実装の間のリンクは、バインディングと呼ばれます。このリンクがコンパイル時に解決されると、静的バインディングと呼ばれます。バインディングが実行時に動的に行われる場合、それを動的バインディングと呼びます。
静的バインディングは、クラスとフィールドのデータ型を使用してメソッド呼び出しを解決します。動的バインディングは、オブジェクトを使用してメソッド呼び出しを解決します。静的バインディングはコンパイル時ポリモーフィズムとも呼ばれ、動的バインディングはランタイムポリモーフィズムとも呼ばれます。
結論
このチュートリアルでは、Javaでのランタイムポリモーフィズムについて詳しく説明しました。
ランタイムポリモーフィズムは、メソッドのオーバーライドを使用して実装されます。メソッドのオーバーライドはサブクラスで実行され、スーパークラスで定義されたメソッドはそのサブクラスで再定義またはオーバーライドされます。メソッドのシグネチャは、スーパークラスとサブクラスで同じままです。
メソッドのオーバーライドを使用することで、サブクラスの同じメソッドに特定の実装を提供できます。このようにして、継承を伴うより効率的なプログラムを作成できます。 Javaは、メソッドがオーバーライドされることを示す@overrideアノテーションを提供します。
デフォルトでは、finalではないすべての非静的メソッドはJavaでは仮想です。すべての仮想メソッドをオーバーライドできます。
=> ここで簡単なJavaトレーニングシリーズに注意してください。