この記事では、例を使用して Java のオーバーロードと書き換えの違いを詳しく分析します。興味のある方は参考にしてください。
1. 過負荷:
(1) メソッドのオーバーロードは、クラスがさまざまな種類のデータを統一した方法で処理するための手段です。パラメータの数や種類が異なる、同じ名前の関数が複数同時に存在します。
オーバーロードは、クラス内のポリモーフィズムの現れです。
(2) Java メソッドのオーバーロードとは、名前は同じですが、パラメーターと定義が異なる複数のメソッドを作成できることを意味します。
メソッドを呼び出すときは、メソッドに渡されるパラメータの数と型に基づいて、どのメソッドを使用するかを決定します。これがポリモーフィズムです。
(3) オーバーロードする場合、メソッド名は同じである必要がありますが、パラメータの型と数は異なり、戻り値の型は同じであっても異なっていても構いません。戻り値の型は、オーバーロードされた関数を区別するための基準として使用できません。
オーバーロードの例を次に示します。
package c04.answer;//これはパッケージ名です//これは、このプログラムの最初のプログラミング メソッドです。まず、main メソッドで Dog クラスのインスタンスを作成し、次に Dog クラスのコンストラクターで this キーワードを使用して呼び出します。異なる樹皮方法。さまざまなオーバーロードされたメソッド bark は、パラメーターの型に従って区別されます。 //注意: コンパイラは、コンストラクター以外の場所でコンストラクターを呼び出すことを禁止します。 package c04.answer;public class Dog {Dog(){this.bark();}void bark()//bark() メソッドはオーバーロードされたメソッドです {System.out.println(/"no barking!/"); this.bark(/"雌/", 3.4);}void bark(String m,double) l)//注: オーバーロードされたメソッドの戻り値は同じです、{System.out.println(/"a barking Dog!/");this.bark(5, /"China/");} void bark(int a,String n)//オーバーロードされたメソッドは戻り値では区別できませんが、「パラメータの型」と「クラス名」でのみ区別できます {System.out.println(/"a howling Dog/") ; }パブリック静的ボイドメイン(String[] args){犬 Dog = new Dog();//dog.bark(); [ページ]//dog.bark(/"雄/", /"黄色/");//dog.bark(5, / "中国/");
2. オーバーライド
(1) 親クラスとサブクラス間のポリモーフィズム。親クラスの機能を再定義します。サブクラスで定義されたメソッドがその親クラスと同じ名前とパラメータを持つ場合、そのメソッドはオーバーライドされていると言います。では、サブクラスは、同じメソッドを書き直すことなく、親クラスからメソッドを継承できます。
ただし、サブクラスが親クラスのメソッドを変更せずに継承するのではなく、メソッドの書き換えが必要となる特定の変更を加えたい場合があります。
メソッドのオーバーライドは、メソッドの上書きとも呼ばれます。
(2) サブクラスのメソッドが親クラスのメソッドと同じメソッド名、戻り値の型、パラメータ リストを持つ場合、新しいメソッドは元のメソッドを上書きします。
親クラスの元のメソッドが必要な場合は、現在のクラスの親クラスを参照する super キーワードを使用できます。
(3) サブクラス関数のアクセス変更権限は、親クラスのアクセス変更権限より小さくすることはできません。
書き換えの例を次に示します。
概念: オブジェクト メソッドを呼び出すためのメカニズム。
動的バインディングの概要:
1. コンパイラは、オブジェクトによって宣言された型とメソッド名をチェックして、すべての候補メソッドを取得します。上記の例の Base クラスのテストをコメントアウトしようとすると、コンパイルは成功しません。
2. オーバーロードの決定: コンパイラはメソッド呼び出しのパラメータの型をチェックし、上記の候補メソッドから 1 つだけを選択します (このプロセス中に暗黙的な型変換が行われます)。
コンパイラが複数の値を検出したか、まったく検出しなかった場合、コンパイラはエラーを報告します。上記の例で Base クラスの test(byte b) をコメントアウトしてみると、実行結果は 1 1 になります。
3. メソッド タイプが priavte static Final で、Java が静的コンパイルを使用する場合、コンパイラは呼び出すメソッドを正確に認識します。
4. プログラムが実行され、動的バインディングを使用してメソッドを呼び出す場合、仮想マシンはオブジェクトの実際の型と一致するメソッド バージョンを呼び出す必要があります。
この例では、b が指す実際の型は TestOverriding なので、b.test(0) はサブクラスのテストを呼び出します。
ただし、サブクラスは test(byte b) をオーバーライドしないため、 b.test((byte)0) は親クラスの test(byte b) を呼び出します。
親クラスの (バイト b) がコメントアウトされている場合、暗黙の型は 2 番目のステップで int に変換され、最終的にサブクラスのテスト (int i) が呼び出されます。
3. 学習の概要:
ポリモーフィズムはオブジェクト指向プログラミングの機能であり、メソッドとは何の関係もありません。
簡単に言うと、同じメソッドが異なる入力データに応じて異なる処理を実行できる、つまりメソッドのオーバーロード - 異なるパラメータリストを使用する(静的多態性)
サブクラスが親クラスから同じメソッドを継承し、同じ入力データを使用するが、親クラスとは異なる応答をしたい場合は、親クラスのメソッドをオーバーライドする必要があります。
つまり、このメソッドをサブクラスで書き直します - 同じパラメーター、異なる実装 (動的ポリモーフィズム)
OOP の 3 つの主要な特徴: 継承、ポリモーフィズム、カプセル化。
public class Base{void test(int i){System.out.print(i);}void test(byte b){System.out.print(b);}} public class TestOverriding extends Base{void test(int i) ){i++;System.out.println(i);}public static void main(String[]agrs){Base b=new TestOverriding();b.test(0)b.test((byte)0)}}
このときの出力結果は 1 0 で、実行時の動的バインディングの結果です。
オーバーライドの主な利点は、サブクラスに固有の特性を定義できることです。
publicclassFather{publicvoidspeak(){System.out.println(父);}} publicclassSonextendsFather{publicvoidspeak(){System.out.println("息子");}}
これはポリモーフィズムとも呼ばれます。オーバーライド メソッドは、親クラスの非プライベート メソッドのみをオーバーライドできます。
上記の例で、Father クラスの speech() メソッドが private の場合、Son クラスは Father クラスの speech() メソッドをオーバーライドできません。このとき、Son クラスの speech() メソッドは、息子クラス。
親クラスの speech() メソッドが最終的なものになると、そのメソッドが public、protected、またはデフォルトによって変更されたかどうかに関係なく、Son クラスは親クラスの speech() メソッドをオーバーライドできなくなります。
コードをコンパイルしようとすると、コンパイラはエラーをスローします。例:
publicclassFather{finalpublicvoidspeak(){System.out.println("Father");}}publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}//コンパイラはエラーを報告します。
親クラスの speech() メソッドがデフォルトで変更される場合、同じパッケージ内にあるサブクラスによってのみオーバーライドできます。同じパッケージ内にない場合はオーバーライドできません。
Father クラスの speech() メソッドがプロトタイプ化されると、同じパッケージ内のそのサブクラスによってオーバーライドされるだけでなく、異なるパッケージのサブクラスによってもオーバーライドされる可能性があります。
メソッドをオーバーライドするためのルール:
1. パラメーター リストはオーバーライドされたメソッドとまったく同じである必要があります。そうでない場合は、書き換えとは言えず、オーバーロードと呼ばれます。
2. 戻り値の型は、オーバーライドされたメソッドの戻り値の型と常に同じである必要があります。そうでない場合は、上書きではなくオーバーロードと呼ぶことができません。
3. アクセス修飾子の制限は、オーバーライドされたメソッドのアクセス修飾子より大きくなければなりません (public>protected>default>private)
4. オーバーライドされたメソッドは、新しいチェック例外、またはオーバーライドされたメソッド宣言よりも広範囲のチェック例外をスローしてはなりません。例えば:
親クラスのメソッドは、チェック済み例外 IOException を宣言します。このメソッドをオーバーライドする場合、例外をスローすることはできません。スローできるのは、IOException のサブクラスの例外だけです。
そしてオーバーロードされたルール:
1. 異なるパラメータリストが必要です。
2. パラメータリストが異なる限り、非非難的な戻り値の型を使用できます。
3. さまざまなアクセス修飾子が存在する可能性があります。
4. さまざまな例外がスローされる可能性があります。
書き換えとオーバーロードの違いは次のとおりです。
ポリモーフィズムのオーバーライドは機能し、オーバーロードされたメソッドを呼び出すときに、異なるパラメーターが渡される限り、同じメソッド名に異なる関数や戻り値を含めることができます。
書き換えとオーバーロードをうまく活用することで、明確で簡潔な構造を持つクラスを設計できます。コードを記述するプロセスにおいて、書き換えとオーバーロードは非常に重要な役割を果たしていると言えます。