この記事では、Java でのオーバーロードとリライトの違いを例を使って詳しく分析します。興味のある方は参考にしてください。
1. オーバーロード:
(1) メソッドのオーバーロードは、クラスがさまざまな種類のデータを統一された方法で処理するための手段です。パラメータの数や種類が異なる、同じ名前の関数が複数同時に存在します。
オーバーロードは、クラス内のポリモーフィズムの現れです。
(2) Java メソッドのオーバーロードとは、名前は同じですが、パラメーターと定義が異なる複数のメソッドを作成できることを意味します。
メソッドを呼び出すときは、メソッドに渡されるパラメーターの異なる数と型に基づいて、どのメソッドを使用するかを決定します。これがポリモーフィズムです。
(3) オーバーロードする場合、メソッド名は同じである必要がありますが、パラメータの型と数は異なり、戻り値の型は同じであっても異なっていても構いません。戻り値の型は、オーバーロードされた関数を区別するための基準として使用できません。
以下はオーバーロードの例です:
package c04.answer;//这是包名 //这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog类的构造方法中利用this关键字调用不同的bark方法。 不同的重载方法bark是根据其参数类型的不同而区分的。 //注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。 package c04.answer; public class Dog { Dog() { this.bark(); } void bark()//bark()方法是重载方法 { System.out.println(\"no barking!\"); this.bark(\"female\", 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\"); } public static void main(String[] args) { Dog dog = new Dog(); //dog.bark(); [Page] //dog.bark(\"male\", \"yellow\"); //dog.bark(5, \"China\");
2. オーバーライド
(1) 親クラスとサブクラス間のポリモーフィズム、親クラスの関数を再定義します。サブクラスで定義されたメソッドがその親クラスと同じ名前とパラメータを持つ場合、そのメソッドはオーバーライドされていると言います。では、サブクラスは、同じメソッドを書き直すことなく、親クラスからメソッドを継承できます。
しかし、場合によっては、サブクラスが親クラスのメソッドを変更せずに継承したくないが、メソッドの書き換えが必要となる特定の変更を加えたい場合があります。
メソッドの書き換えは、メソッドの上書きとも呼ばれます。
(2) サブクラスのメソッドが親クラスのメソッドと同じメソッド名、戻り値の型、パラメータリストを持つ場合、新しいメソッドは元のメソッドを上書きします。
親クラスの元のメソッドが必要な場合は、現在のクラスの親クラスを参照する super キーワードを使用できます。
(3) サブクラス関数のアクセス変更権限は、親クラスのアクセス変更権限より低くすることはできません。
以下は書き換えの例です:
概念: オブジェクト メソッドを呼び出すためのメカニズム。
動的バインディングの裏話:
1. コンパイラは、オブジェクト宣言の型とメソッド名をチェックして、すべての候補メソッドを取得します。上記の例の Base クラスのテストをコメントアウトしようとすると、コンパイルは成功しません。
2. オーバーロードの決定: コンパイラーはメソッド呼び出しのパラメーターの型をチェックし、上記の候補メソッドから 1 つだけを選択します (このプロセス中に暗黙的な型変換が行われます)。
コンパイラーが複数を検出した場合、または何も見つからなかった場合、コンパイラーはエラーを報告します。上記の例の Base クラスのテスト (バイト 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に変換され、最終的にサブクラスのtest(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(Father); } } publicclassSonextendsFather{ publicvoidspeak(){ System.out.println("son"); } }
これは、オーバーライド メソッドは継承関係内でのみ存在できます。非プライベート メソッドをオーバーライドできます。
上記の例でFatherクラスのspeak()メソッドがprivateの場合、SonクラスはFatherクラスのspeak()メソッドをオーバーライドできません。このとき、Sonクラスのspeak()メソッドは、で定義されたspeak()メソッドと同等になります。息子クラス。
親クラスの speech() メソッドが最終的なものになると、そのメソッドが public、protected、またはデフォルトによって変更されたかどうかに関係なく、Son クラスは親クラスの speech() メソッドをまったくオーバーライドできなくなります。コンパイラはエラーを報告します。例:
publicclassFather{ finalpublicvoidspeak(){ System.out.println("Father"); } } publicclassSonextendsFather{ publicvoidspeak(){ System.out.println("son"); } }//编译器会报错;
Father クラスの speech() メソッドがプロト化されると、同じパッケージ内のそのサブクラスによってオーバーライドされるだけでなく、異なるパッケージのサブクラスによってもオーバーライドされる可能性があります。
1. パラメータリストはオーバーライドされたメソッドと完全に同じである必要があります。そうでない場合、それは書き換えとは言えず、オーバーロードと呼ばれます。
2. 戻り値の型は、オーバーライドされたメソッドの戻り値の型と常に同じである必要があります。そうでない場合は、上書きと呼ばれることはできず、オーバーロードと呼ばれます。
3. アクセス修飾子の制限は、オーバーライドされたメソッドのアクセス修飾子より大きくなければなりません (public>protected>default>private)
4. オーバーライドされたメソッドは、新しいチェック例外をスローしたり、オーバーライドされたメソッドの宣言よりも厳格であってはなりませんチェックされた例外。例:
親クラスのメソッドは、チェックされた例外 IOException を宣言します。このメソッドをオーバーライドする場合、例外をスローすることはできません。また、スローできるのは IOException のサブクラスの例外のみです。
オーバーロードのルール:
1. 異なるパラメーター リストが必要です。 2. 異なるアクセス修飾子を使用できます。 4. さまざまな例外をスローできます。
書き換えとオーバーロードの違いは次のとおりです。
書き換えとオーバーロードをうまく使用すると、明確で簡潔な構造を持つクラスを設計できます。コードを書くプロセスにおいて、書き換えとオーバーロードは特別な役割を果たすと言えます。
Java でのオーバーロードと書き換えを分析するその他の例違いがある場合は、PHP 中国語 Web サイトに注意してください。