Java オーバーライド/オーバーロード
Override
Override は、アクセスを許可する親クラスのメソッドの実装プロセスをサブクラスが書き換えることです。戻り値も仮パラメータも変更できません。つまり、シェルは変更されず、コアが書き換えられます。
オーバーライドの利点は、サブクラスが必要に応じて独自の動作を定義できることです。
つまり、サブクラスは必要に応じて親クラスのメソッドを実装できます。
オブジェクト指向の原則では、オーバーライドとは、既存のメソッドをオーバーライドできることを意味します。例は次のとおりです。
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象 a.move();// 执行 Animal 类的方法 b.move();//执行 Dog 类的方法 } }
上記の例のコンパイルと実行結果は次のとおりです。
动物可以移动 狗可以跑和走
上記の例でわかるように、b は Animal タイプに属していますが、Dog の move メソッドを実行します。クラス。
これは、コンパイル段階ではパラメータの参照型のみがチェックされるためです。
ただし、実行時に、Java 仮想マシン (JVM) はオブジェクトのタイプを指定し、オブジェクトのメソッドを実行します。
つまり、上記の例でコンパイルが成功するのは、Animal クラスに move メソッドが存在するためですが、実行時には特定のオブジェクトのメソッドが実行されます。
次の例について考えてみましょう:
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } public void bark(){ System.out.println("狗可以吠叫"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象 a.move();// 执行 Animal 类的方法 b.move();//执行 Dog 类的方法 b.bark(); } }
上記の例のコンパイル結果と実行結果は次のとおりです:
TestDog.java:30: cannot find symbol symbol : method bark() location: class Animal b.bark(); ^
b の参照型、Animal には bark メソッドがないため、このプログラムはコンパイル エラーをスローします。
メソッドの書き換えルール
パラメーターのリストは、オーバーライドされたメソッドのリストとまったく同じである必要があります
戻り値の型は、オーバーライドされたメソッドの戻り値の型とまったく同じでなければなりません
アクセス権は、親クラスでオーバーライドされたメソッドのアクセス権より低くすることはできません。例: 親クラスのメソッドが public として宣言されている場合、サブクラスでメソッドをオーバーライドするときにそのメソッドを protected として宣言することはできません。
親クラスのメンバー メソッドは、そのサブクラスによってのみオーバーライドできます。
Final として宣言されたメソッドはオーバーライドできません。
static として宣言されたメソッドはオーバーライドできませんが、再度宣言することはできます。
サブクラスと親クラスが同じパッケージ内にある場合、サブクラスは、private および Final として宣言されたメソッドを除く、親クラスのすべてのメソッドをオーバーライドできます。
サブクラスと親クラスが同じパッケージ内にない場合、サブクラスは、public および protected と宣言されている親クラスの非finalメソッドのみをオーバーライドできます。
オーバーライドされたメソッドは、オーバーライドされたメソッドが例外をスローするかどうかに関係なく、強制されない例外をスローできます。ただし、オーバーライドされたメソッドは、新しい必須例外や、オーバーライドされたメソッドで宣言された例外よりも広範囲の必須例外をスローすることはできません。また、その逆も同様です。
コンストラクターをオーバーライドすることはできません。
メソッドを継承できない場合、このメソッドをオーバーライドすることはできません。
Super キーワードの使用
親クラスのオーバーライドされたメソッドをサブクラスで呼び出す必要がある場合は、super キーワードを使用します。
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ super.move(); // 应用super类的方法 System.out.println("狗可以跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal b = new Dog(); // Dog 对象 b.move(); //执行 Dog类的方法 } }
上記の例のコンパイルと実行結果は以下の通りです:
动物可以移动 狗可以跑和走
Overload(オーバーロード)
Overloading(オーバーロード)はクラス内にあり、メソッド名は同じですがパラメータが異なります。戻り値の型は同じでも異なっていても構いません。
オーバーロードされた各メソッド (またはコンストラクター) には、一意のパラメーター型リストが必要です。
コンストラクタのみをオーバーロードできます
オーバーロードのルール
オーバーロードされたメソッドはパラメータリストを変更する必要があります
オーバーロードされたメソッドは戻り値の型を変更できます
オーバーロードされたメソッドは変更できます。
オーバーロードされたメソッドは、新しいまたはより広範囲のチェック例外を宣言できます。
メソッドは、同じクラスまたはサブクラスでオーバーロードできます。
インスタンス
public class Overloading { public int test(){ System.out.println("test1"); return 1; } public void test(int a){ System.out.println("test2"); } //以下两个参数类型顺序不同 public String test(int a,String s){ System.out.println("test3"); return "returntest3"; } public String test(String s,int a){ System.out.println("test4"); return "returntest4"; } public static void main(String[] args){ Overloading o = new Overloading(); System.out.println(o.test()); o.test(1); System.out.println(o.test(1,"test3")); System.out.println(o.test("test4",1)); } }
上書きとオーバーロードの違い
相違点 | オーバーロードメソッド | オーバーライドメソッド |
---|---|---|
パラメータリスト | の変更が必要 | 確かに変更はできません |
戻り値の型 | 変更可能 | 変更不可 |
例外 | 変更可能 | は削減または削除可能、新規またはより広範囲の例外をスローしてはなりません |
アクセス | 変更可能 | 制限を厳しくしてはなりません(制限を下げることは可能です) |