Javaの書き換え(上書き)とオーバーロード(過負荷)
リライト(オーバーライド)
書き換えは再書き込みするために、親クラスのメソッドへのアクセスを可能にするために、実装プロセスのサブクラスです! 戻り値やパラメータは変更されません。 つまり、同じケースで、コアが書き換え!
必要に応じて、サブクラスの利点を書き換え、彼らの行動の特定定義します。
それは、必要に応じて実現することができる親クラスのメソッドのサブクラスです。
オブジェクト指向の原則では、書き換えはあなたが任意の既存のメソッドをオーバーライドできることを意味します。 例としては、次のとおりです:
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が動物の種類をに属していても、見ることができますが、それは移動操作方法犬クラスです。
これは、コンパイル時ではなく、参照型のパラメータをチェックします。
ただし、実行時に、指定されたオブジェクトとオブジェクトの操作の方法のJava仮想マシン(JVM)のタイプ。
moveメソッドはAnimalクラスを存在しますが、実行して実行すると、特定のオブジェクトのメソッドであるため、したがって、上記の例では、コンパイラが成功することができました。
次の例を考えてみます。
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参照型動物の樹皮方法がないため、プログラムは、コンパイルエラーがスローされます。
ルールを書き換える方法
- パラメータリストが書き換えする方法とまったく同じでなければなりません。
- メソッドの戻り値の型が同じであると戻り値の型が完全に書き直さなければなりません。
- アクセスは、親クラスアクセスオーバーライドメソッド以上です。 例:親クラスがpublic宣言されている場合は、サブクラスでこのメソッドをオーバーライド保護として宣言することはできません。
- 親クラスのメンバーにのみそのサブクラスをオーバーライドすることができます。
- finalメソッドをオーバーライドすることができないように宣言しました。
- 静的メソッドとして宣言を書き換えることはできませんが、再び宣言することができます。
- 同じパッケージ内の親クラスとサブクラスは、サブクラスは、プライベートと最終進入の文以外のすべてのメソッドの親クラスをオーバーライドすることができます。
- サブクラスとスーパークラスは、これだけサブクラスは、パブリックとのために保護された親クラスの非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类的方法 } }
次のような結果をコンパイルした上記の例は次のとおりです。
动物可以移动 狗可以跑和走
オーバーロード(過負荷)
過負荷(オーバーロード)は、異なるパラメータを使用して、同じ名前のメソッド内のクラスです。 戻り型は、同じでも異なっていてもよいです。
それぞれのオーバーロードされたメソッド(またはコンストラクタ)は、引数の型のユニークなリストを持っている必要があります。
唯一のオーバーロードコンストラクタ
オーバーロードのルール
- オーバーロードメソッドは、パラメータのリストを変更する必要があります。
- オーバーロードされたメソッドは、戻り値の型を変更することができます。
- オーバーロードされたメソッドは、アクセス修飾子を変更することができます。
- オーバーロードされたメソッドは、新規またはより広範なチェック例外を宣言することができます。
- この方法は、同じクラスであってもよく、またはサブクラスで過負荷になります。
例
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)); } }
オーバーロードの違いを書き換え
相違点 | オーバーロードされたメソッド | メソッドのオーバーライド |
---|---|---|
パラメータ一覧 | あなたは変更する必要があります | 変更しないでください |
戻り型 | あなたが変更することができます | 変更しないでください |
異常な | あなたが変更することができます | 減少または除去することができ、あなたは、新規またはより広範な例外をスローしてはいけません |
アクセス | あなたが変更することができます | より厳しい制限があってはなりません(制限を低減することができます) |