オーバーライドとオーバーロードの詳細な説明
オーバーライド
親クラスと子クラスの間のポリモーフィズムは、親クラスのメソッド(関数)を再定義します。
サブクラスで定義されたメソッドがその親クラスと同じ名前とパラメーターを持っている場合、そのメソッドはオーバーライドされていると言います。
Javaでは、サブクラスは、同じメソッドを書き直す必要なしに、親クラスのメソッドを継承できます。
サブクラスが親クラスのメソッドをそのまま継承したくないが、特定の変更を加えたい場合があります。これには、メソッドの書き換えが必要です。
メソッドのオーバーライドは、メソッドのオーバーライドとも呼ばれます。サブクラスのメソッドが親クラスのメソッドと同じメソッド名、戻り値の型、およびパラメーターリストを持っている場合、新しいメソッドは元のメソッドを上書きします。
親クラスに元のメソッドが必要な場合は、現在のクラスの親クラスを参照するsuperキーワードを使用できます。
注:サブクラス関数のアクセス変更権限は、親クラスのアクセス変更権限よりも小さくすることはできません。
- 書き換えとは、親クラスのアクセス可能なメソッドの実装プロセスをサブクラスで書き換えるプロセスであり、戻り値も仮パラメータも変更できません。つまり、シェルは変更されず、コアが書き換えられます。
- オーバーライドの利点は、サブクラスが必要に応じて独自の特定の動作を定義できることです。つまり、サブクラスは必要に応じて親クラスのメソッドを実装できます。
- オーバーライドされたメソッドは、新しいチェックされた例外またはオーバーライドされたメソッド宣言よりも広い例外をスローすることはできません。次に例を示します。親クラスのメソッドはチェック例外IOExceptionを宣言しますが、ExceptionはIOExceptionの親クラスであり、IOExceptionのサブクラス例外しかスローできないため、このメソッドをオーバーライドするときにExceptionをスローすることはできません。
コードは次のとおりです(例):
class Person{
public void introduce(){
System.out.println("我是人类");
}
}
class Teacher extends Person{
/**
* 重写了父类 Person 的 introduce 方法
*/
public void introduce(){
System.out.println("我是老师");
}
}
class Student extends Person{
/**
* 重写了父类 Person 的 introduce 方法
*/
public void introduce(){
System.out.println("我是学生");
}
}
public class TestPerson {
public static void main(String args[]){
Person a = new Person();
Person b = new Teacher ();
Person c = new Student ();
a.introduce();
b.introduce();
c.introduce();
}
}
メソッド書き換えルール
- オーバーライドされたメソッドのパラメーターリストとパラメーターリストは完全に同じである必要があります。
- オーバーライドされたメソッドの戻り値の型と戻り値の型は異なる場合がありますが、親クラスの戻り値の派生クラスである必要があります(java5以前のバージョンの戻り値の型は同じで、java7の戻り値の型は同じである必要があります)以降のバージョンは異なる場合があります)。
- アクセス権限は、親クラスのオーバーライドされたメソッドのアクセス権限より低くすることはできません。例:親クラスのメソッドがパブリックとして宣言されている場合、子クラスのメソッドをオーバーライドすることは保護されていると宣言できません。
- 親クラスのメンバーメソッドは、そのサブクラスによってのみオーバーライドできます。
- finalとして宣言されたメソッドはオーバーライドできません。
- 静的として宣言されたメソッドはオーバーライドできませんが、再度宣言することはできます。
- サブクラスとスーパークラスが同じパッケージにある場合、サブクラスは、privateおよびfinalとして宣言されたメソッドを除いて、スーパークラスのすべてのメソッドをオーバーライドできます。
- サブクラスと親クラスは同じパッケージに含まれていないため、サブクラスは、パブリックとして宣言され、親クラスから保護されている非最終メソッドのみをオーバーライドできます。
- オーバーライドされたメソッドは、オーバーライドされたメソッドが例外をスローするかどうかに関係なく、必須ではない例外をスローできます。ただし、オーバーライドされたメソッドは、新しい必須例外、またはオーバーライドされたメソッドによって宣言されたものよりも広い必須例外をスローすることはできません。その逆も同様です。
- 構築方法を上書きすることはできません。
- クラスを継承できない場合、そのクラスのメソッドをオーバーライドすることはできません。
過負荷
単一のクラス、同じ名前のメソッド、ただしパラメーターが異なる場合のオーバーロード。戻り値の型は同じでも異なっていてもかまいません。
オーバーロードされた各メソッド(またはコンストラクター)には、パラメータータイプの一意のリストが必要です。
ヒント:最も一般的な場所は、コンストラクターのオーバーロードです。
メソッドのオーバーロードは、クラスのポリモーフィズムの現れです。
メソッドのオーバーロードは、クラスがさまざまなタイプのデータを均一に処理するための手段です。
同じ名前の複数の関数が同時に存在し、パラメーターの数またはタイプが異なります。
Javaでのメソッドのオーバーロードは、クラス内に複数のメソッドを作成できることを意味します。それらの名前は同じですが、パラメーターと定義が異なります。
メソッドを呼び出すとき、メソッドに渡されるさまざまなパラメーターの数とパラメーターのタイプによって、使用するメソッドが決まります。これはポリモーフィズムです。
注:戻り値の型は、オーバーロードされた関数を区別するための基準として使用することはできません。
コードは次のとおりです(例):
public class Overload {
public int test(){
System.out.println("test1");
return 1;
}
/**
* 以下三个重载了本类的 test 方法
*/
public void test(int a){
System.out.println("test2");
}
/**
* 以下两个参数类型顺序不同
*/
public String test(int a,String s){
System.out.println("test3");
return "return test3";
}
public String test(String s,int a){
System.out.println("test4");
return "return test4";
}
public static void main(String[] args){
Overload overload = new Overload();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1,"test3"));
System.out.println(o.test("test4",1));
}
}
メソッドのオーバーロードルール:
- オーバーロードされたメソッドは、パラメーターリストを変更する必要があります(パラメーターの数またはタイプは同じではありません)。
- オーバーロードされたメソッドは、戻り値の型を変更できます。
- オーバーロードされたメソッドは、アクセス修飾子を変更できます。
- オーバーロードされたメソッドは、新しいまたはより広範なチェック済み例外を宣言できます。
- メソッドは、同じクラスまたはサブクラスでオーバーロードできます。
- 戻り値の型は、オーバーロードされた関数を区別するための基準として使用することはできません。
書き換えとリロードの違い
過負荷:
- 同じクラスで発生します。
- 同じメソッド名。
- パラメータリストは異なります。
- 戻り値に関係なく、異なる戻り値を持つ「過負荷」がある場合、それは間違っています。
リライト:
- サブクラスと親クラスで発生します。
- 同じメソッド名。
- 同じパラメータリスト。
- 戻り値が同じであるか、サブクラスメソッドの戻り値が親メソッドの戻り値タイプのサブクラスである。
- アクセス修飾子が同じであるか、サブクラスメソッドの修飾子の範囲が親クラスよりも大きい。
- スローされる例外が同じであるか、サブクラスメソッドによってスローされる例外が親クラスよりも小さい。
メソッドの書き換え(オーバーライド)とオーバーロード(オーバーロード)は、Javaポリモーフィズムの異なる表現です。書き換えは、親クラスとサブクラスの間のポリモーフィズムの表現であり、オーバーロードは、ポリモーフィズムの特定の表現として理解できます。
- メソッドのオーバーロードは、同じ名前の複数のメソッドを持つクラスで定義されますが、パラメーターの数が異なるか、数は同じですが、タイプと順序が異なります。これは、メソッドのオーバーロードと呼ばれます。
- メソッドのオーバーライドは、サブクラスのメソッドの名前が親クラスのメソッドと同じであり、パラメーターの数がタイプと同じであり、戻り値が同じメソッドであるメソッドです。オーバーライドします。
- メソッドのオーバーロードはクラスのポリモーフィズムであり、メソッドのオーバーライドはサブクラスと親クラスのポリモーフィズムです。
違いの比較分析:
差 | オーバーロードされたメソッド | 書き換え方法 |
---|---|---|
パラメータリスト | 変更する必要があります | 変更してはいけません |
戻り値の型 | 変更可能 | 変更してはいけません |
異常な | 変更可能 | 削減または削除でき、新しい例外またはより広範な例外をスローしてはなりません |
アクセス | 変更可能 | より厳しい制限を加えてはなりません(制限を下げることができます) |