Java におけるメソッドのオーバーロードとメソッドのオーバーライドの違いは次のとおりです。
メソッドのオーバーロード | メソッドのオーバーライド |
|---|---|
| メソッドのオーバーロードはコンパイル時のポリモーフィズムです。 | メソッドのオーバーライドは実行時のポリモーフィズムです。 |
| メソッドのオーバーロードは、プログラムの可読性を高めるのに役立ちます。 | メソッドのオーバーライドは、親クラスまたはスーパークラスによってすでに提供されているメソッドの特定の実装を許可するために使用されます。 |
| それはクラス内で起こります。 | これは、継承関係を持つ 2 つのクラスで実行されます。 |
| メソッドのオーバーロードには継承が必要な場合とそうでない場合があります。 | メソッドのオーバーライドには常に継承が必要です。 |
| メソッドのオーバーロードでは、メソッドは同じ名前で異なるシグネチャを持つ必要があります。 | メソッドのオーバーライドでは、メソッドは同じ名前と同じシグネチャを持つ必要があります。 |
| メソッドのオーバーロードでは、戻り値の型が同じである場合とそうでない場合がありますが、パラメーターを変更するだけで済みます。 | メソッドのオーバーライドでは、戻り値の型は同じか共変である必要があります。 |
| 静的バインディングはオーバーロードされたメソッドに使用されます。 | 動的バインディングはメソッドをオーバーライドするために使用されます。 |
| コンパイル時のポリモーフィズムによるパフォーマンスの低下。 | より良いパフォーマンスが得られます。この背後にある理由は、オーバーライドされたメソッドのバインドが実行時に行われるためです。 |
| プライベートメソッドとファイナルメソッドはオーバーロードできます。 | プライベートメソッドとファイナルメソッドはオーバーライドできません。 |
| メソッドのオーバーロードを行うときは、引数リストは異なる必要があります。 | 引数リストはメソッドのオーバーライドで同じである必要があります。 |
Java でのメソッドのオーバーロード
メソッドのオーバーロード です コンパイル時のポリモーフィズム 。メソッドのオーバーロードでは、クラス内で複数のメソッドが、異なるシグネチャを持つ同じメソッド名を共有します。メソッドのオーバーロードでは、戻り値の型が同じである場合とそうでない場合がありますが、パラメータを変更する必要があります。Java では、メソッドの戻り値の型だけを変更するだけではメソッドのオーバーロードを実現できないためです。
メソッドのオーバーロードの例:
ジャワ
// Java Program to Implement // Method Overloading import java.io.*; class MethodOverloadingEx { static int add(int a, int b) { return a + b; } static int add(int a, int b, int c) { return a + b + c; } // Main Function public static void main(String args[]) { System.out.println('add() with 2 parameters'); // Calling function with 2 parameters System.out.println(add(4, 6)); System.out.println('add() with 3 parameters'); // Calling function with 3 Parameters System.out.println(add(4, 6, 7)); } }> 出力
add() with 2 parameters 10 add() with 3 parameters 17>
Java でのメソッドのオーバーライド
メソッドのオーバーライド です 実行時のポリモーフィズム 。メソッドのオーバーライドでは、派生クラスは、基本クラスまたは親クラスによってすでに提供されているメソッドの特定の実装を提供します。メソッドのオーバーライドでは、戻り値の型は同じか共変である必要があります (戻り値の型は派生クラスと同じ方向に変化する可能性があります)。
メソッドのオーバーライドの例:
ジャワ // Java Program to implement // Method Overriding import java.io.*; // Base Class class Animal { void eat() { System.out.println('eat() method of base class'); System.out.println('eating.'); } } // Inherited Class class Dog extends Animal { void eat() { System.out.println('eat() method of derived class'); System.out.println('Dog is eating.'); } } // Driver Class class MethodOverridingEx { // Main Function public static void main(String args[]) { Dog d1 = new Dog(); Animal a1 = new Animal(); d1.eat(); a1.eat(); // Polymorphism: Animal reference pointing to Dog object Animal animal = new Dog(); // Calls the eat() method of Dog class animal.eat(); } }> 出力
eat() method of derived class Dog is eating. eat() method of base class eating. eat() method of derived class Dog is eating.>
上記プログラムの説明:
ここでは、メソッド Eat() が派生クラス名でオーバーライドされていることがわかります。 犬 これは基本クラス名によってすでに提供されています 動物 。 Dog クラスのインスタンスを作成して Eat() メソッドを呼び出すと、基本クラスのメソッド Eat() の代わりに派生クラスの Eat() メソッドのみが実行されることがわかります。また、Animal クラスのインスタンスを作成して Eat() メソッドを呼び出すと、 ) メソッドを確認すると、派生クラスのメソッド Eat() ではなく、基本クラスの Eat() メソッドのみが実行されることがわかります。