Javaの書き換え(Override)とリロード(Override)
書き換え(Override)
書き換えは、子クラスが親クラスにアクセスできるメソッドの実装プロセスを再記述します.戻り値もパラメータも変更できません.つまり、ハウジングは変わらず、コアは書き換えられます!
書き換えの利点は、サブクラスが必要に応じて、自分固有の動作を定義できることです.すなわち,子クラスは必要に応じて親クラスを実現する方法である.
メソッド書き換えのルール
パラメータリストは、書き換え方法と完全に同じである必要があります.
戻りタイプは、書き換え方法の戻りタイプと完全に同じでなければならない.
親クラスで書き換えられたメソッドよりもアクセス権を高くすることはできません.たとえば、親クラスのメソッドがpublicとして宣言されている場合、サブクラスでメソッドを書き換えるとprotectedとして宣言できません.
親クラスのメンバーメソッドは、その子クラスによってのみ書き換えられます.
finalとして宣言する方法は書き換えられません.
staticとして宣言する方法は書き換えることはできませんが、再宣言することができます.
メソッドが継承されない場合、メソッドは書き換えられません.
子クラスと親クラスが同じパッケージにある場合、privateとfinalとして宣言されたメソッドを除いて、子クラスは親クラスのすべてのメソッドを書き換えることができます.
サブクラスと親クラスが同じパッケージに含まれていない場合、サブクラスはpublicとprotectedとして宣言された非finalメソッドのみを書き換えることができます.
書き換え方法は、書き換えられた方法が異常を投げ出すかどうかにかかわらず、非強制異常を投げ出すことができる.しかし、書き換えの方法は、新しい強制的な異常を投げ出すことができず、あるいは書き換えの方法によって宣言されたよりも広範な強制的な異常を投げ出すことができず、逆に可能である.
構造方法は書き換えられない.
メソッドを継承できない場合は、このメソッドを書き換えることはできません.
リロード(Overload)
リロード(overloading)は、メソッド名が同じで、パラメータが異なるクラスにあります.戻りタイプは同じでも異なってもよい.
各リロードメソッド(またはコンストラクション関数)には、ユニークなパラメータタイプのリストが必要です.
コンストラクタの再ロードのみ
メソッドリロードのルール
リロードされる方法はパラメータリストを変更する必要があります.
リロードされる方法は、戻りタイプを変更することができる.
リロードされる方法は、アクセス修飾子を変更することができる.
リロードされたメソッドは、新しいまたはより広い検査異常を宣言することができる.
方法は、同じクラスにおいて、または1つのサブクラスにおいて、をリロードすることができる.
メソッド書き換えとリロードの違い
区別点
リロード方法
書き換え方法
パラメータリスト
変更する必要があります
きっと修正できない
戻りタイプ
変更可能
きっと修正できない
異常
変更可能
減らしたり削除したりすることができて、きっと新しいあるいはもっと広い異常を投げ出すことができません
アクセス
変更可能
きっともっと厳しい制限はできない(制限を下げることができる)
関連練習問題
1リロードの方法は戻りタイプによって区別できますか?
1)メソッドのリロードと書き換えはいずれもマルチステートを実現する方式であり,前者はコンパイル時のマルチステートを実現し,後者は実行時のマルチステートを実現する.
2)リロードは1つのクラスで発生し、同じ名前のメソッドが異なるパラメータリスト(パラメータタイプが異なる、パラメータ個数が異なる、または両方が異なる)がある場合はリロードとみなされます.
3)書き換えは、子と親の間で発生し、書き換えを求める子の書き換え方法は、親の書き換え方法と同じ戻りタイプであり、親の書き換え方法よりもアクセスが良く、親の書き換え方法よりも多くの異常を宣言することはできない(リ氏置換原則).
4)リロードは戻りタイプに特別な要求はありません.
2サンプルコードの表示方法の書き換えとリロードの違いを書き出します
書き換え:
実行結果:
これは動物ですこれは猫ですこれは犬です
Process finished with exit code 0
じゅうか
実行結果:
パラメータなしメソッド1つのパラメータのメソッドで、パラメータは:1 2つのパラメータのメソッドで、最初のパラメータは:1 2番目のパラメータは:Hello
Process finished with exit code 0
参考までに、ご指摘ください.
書き換えは、子クラスが親クラスにアクセスできるメソッドの実装プロセスを再記述します.戻り値もパラメータも変更できません.つまり、ハウジングは変わらず、コアは書き換えられます!
書き換えの利点は、サブクラスが必要に応じて、自分固有の動作を定義できることです.すなわち,子クラスは必要に応じて親クラスを実現する方法である.
メソッド書き換えのルール
パラメータリストは、書き換え方法と完全に同じである必要があります.
戻りタイプは、書き換え方法の戻りタイプと完全に同じでなければならない.
親クラスで書き換えられたメソッドよりもアクセス権を高くすることはできません.たとえば、親クラスのメソッドがpublicとして宣言されている場合、サブクラスでメソッドを書き換えるとprotectedとして宣言できません.
親クラスのメンバーメソッドは、その子クラスによってのみ書き換えられます.
finalとして宣言する方法は書き換えられません.
staticとして宣言する方法は書き換えることはできませんが、再宣言することができます.
メソッドが継承されない場合、メソッドは書き換えられません.
子クラスと親クラスが同じパッケージにある場合、privateとfinalとして宣言されたメソッドを除いて、子クラスは親クラスのすべてのメソッドを書き換えることができます.
サブクラスと親クラスが同じパッケージに含まれていない場合、サブクラスはpublicとprotectedとして宣言された非finalメソッドのみを書き換えることができます.
書き換え方法は、書き換えられた方法が異常を投げ出すかどうかにかかわらず、非強制異常を投げ出すことができる.しかし、書き換えの方法は、新しい強制的な異常を投げ出すことができず、あるいは書き換えの方法によって宣言されたよりも広範な強制的な異常を投げ出すことができず、逆に可能である.
構造方法は書き換えられない.
メソッドを継承できない場合は、このメソッドを書き換えることはできません.
リロード(Overload)
リロード(overloading)は、メソッド名が同じで、パラメータが異なるクラスにあります.戻りタイプは同じでも異なってもよい.
各リロードメソッド(またはコンストラクション関数)には、ユニークなパラメータタイプのリストが必要です.
コンストラクタの再ロードのみ
メソッドリロードのルール
リロードされる方法はパラメータリストを変更する必要があります.
リロードされる方法は、戻りタイプを変更することができる.
リロードされる方法は、アクセス修飾子を変更することができる.
リロードされたメソッドは、新しいまたはより広い検査異常を宣言することができる.
方法は、同じクラスにおいて、または1つのサブクラスにおいて、をリロードすることができる.
メソッド書き換えとリロードの違い
区別点
リロード方法
書き換え方法
パラメータリスト
変更する必要があります
きっと修正できない
戻りタイプ
変更可能
きっと修正できない
異常
変更可能
減らしたり削除したりすることができて、きっと新しいあるいはもっと広い異常を投げ出すことができません
アクセス
変更可能
きっともっと厳しい制限はできない(制限を下げることができる)
関連練習問題
1リロードの方法は戻りタイプによって区別できますか?
1)メソッドのリロードと書き換えはいずれもマルチステートを実現する方式であり,前者はコンパイル時のマルチステートを実現し,後者は実行時のマルチステートを実現する.
2)リロードは1つのクラスで発生し、同じ名前のメソッドが異なるパラメータリスト(パラメータタイプが異なる、パラメータ個数が異なる、または両方が異なる)がある場合はリロードとみなされます.
3)書き換えは、子と親の間で発生し、書き換えを求める子の書き換え方法は、親の書き換え方法と同じ戻りタイプであり、親の書き換え方法よりもアクセスが良く、親の書き換え方法よりも多くの異常を宣言することはできない(リ氏置換原則).
4)リロードは戻りタイプに特別な要求はありません.
2サンプルコードの表示方法の書き換えとリロードの違いを書き出します
書き換え:
public class OverrideDemo {
public static void main(String[] args) {
Animal animal = new Animal();
animal.animalPrint();
Animal cat = new Cat();
cat.animalPrint();
Animal dog = new Dog();
dog.animalPrint();
}
}
class Animal {
public void animalPrint() {
System.out.println(" ");
}
}
class Cat extends Animal {
@Override
public void animalPrint() {
System.out.println(" ");
}
}
class Dog extends Animal {
@Override
public void animalPrint() {
System.out.println(" ");
}
}
実行結果:
これは動物ですこれは猫ですこれは犬です
Process finished with exit code 0
じゅうか
public class OverrideDemoTest {
public void printDemo() {
System.out.println(" ");
}
public void printDemo(int a) {
System.out.println(" , :" + a);
}
public void printDemo(int a, String b) {
System.out.println(" , :" + a + " :" + b);
}
public static void main(String[] args) {
OverrideDemoTest overrideDemoTest = new OverrideDemoTest();
overrideDemoTest.printDemo();
overrideDemoTest.printDemo(1);
overrideDemoTest.printDemo(1, "Hello");
}
}
実行結果:
パラメータなしメソッド1つのパラメータのメソッドで、パラメータは:1 2つのパラメータのメソッドで、最初のパラメータは:1 2番目のパラメータは:Hello
Process finished with exit code 0
参考までに、ご指摘ください.