メソッドオーバーライド(Override)の制約(一)

3824 ワード

1.サブクラスメソッドの名前、パラメータ署名、および戻りタイプは、親メソッドの名前、パラメータ署名、および戻りタイプと一致する必要があります.
 
public class Base {
    public void method() {… …}
}
public class Sub extends Base {
    public void method() {… …}
    public int method(int a) {
         return 0;
    }
}

 
上記のコードの中性子クラスは、親クラスのメソッドを上書きし、再ロードメソッドを定義します.これは合法です.
 2.子メソッドでは、親メソッドのアクセス権を縮小できません.
 
public class Base {
    public void method() {… …}
}
public class Sub extends Base {
    private void method() {… …}  // , 
}

  
  3.子メソッドは、親メソッドよりも多くの例外を放出できません.サブクラスメソッドが放出する例外は、親メソッドが放出する例外と同じであるか、またはサブクラスメソッドが放出する例外は、親メソッドが放出する異常のサブクラスである必要があります.
 4.メソッドオーバーライドは、直接親と間接親を含む子と親の間にのみ存在します.同じクラスでのメソッドはリロードされ、上書きされません.
public class Base {
    public void method() throws ExceptionSub1{… …}
}	
public class Sub1 extends Base {
    public void method() throws ExceptionBase {… …}     // 
}
public class Sub2 extends Base  {
    public void method throws ExcetptionSub1,ExceptionSub2() {… …}   // 
}

 
 
   5. 親の静的メソッドは、クラスを非静的メソッドに上書きすることはできません.
public class Base {
    public static void method() {… …}
}
public class Sub extends Base {
    public void method() {… …}
}

 6.子クラスは、親の静的メソッドと同じ名前の静的メソッドを定義して、親の静的メソッドを子クラスに隠すことができます.コンパイル時に、サブクラス定義の静的メソッドも、メソッドの上書きと同様の制約を満たす必要があります.メソッドのパラメータ署名が一致し、戻りタイプが一致し、親メソッドのアクセス権を縮小することはできません.より多くの例外を放出することはできません.
子クラス非表示親の静的メソッドと子クラスが親を上書きするインスタンスメソッドの違い:実行時にJava仮想マシンは静的メソッドと所属するクラスをバインドし、インスタンスメソッドと所属するインスタンスをバインドします.
次の例を分析します.
class Base {
    void method() {				// 
    System.out.println("method of Base");
}
    static void staticmethod() {	// 
        System.out.println("static method of Base");
    }
}
public class Sub extends Base {
    void method() {		// method()
        System.out.println("method of Sub");
    }
    static void staticmethod() {	// staticmethod
	System.out.println("static method of Sub");
    }
    public static void main(String[] args) {
	Base sub1 = new Sub();	//sub1 Base , Sub 
	sub1.method();		// method of Sub
	sub1.staticmethod();		// static method of Base   : Base staticMethod() 
	Sub sub2 = new Sub();	//sub2 Sub , Sub 
	sub2.method();		// method of Sub
	sub2.staticmethod();		// static method of Sub	 : Base staticMethod() staticMethod() 
   }
}

  7.親のプライベートメソッドは、クラスに上書きされません.
 
class Base {
    private String showMe() {
	return "Base";
    }
    public void print() {
	System.out.println(showMe());
    }
}
public class Sub extends Base{
    public String showMe() {
	return "Sub";
    }
    public static void main(String[] args) {
	Sub sub = new Sub();
	sub.print();
    }
}

印刷結果:Base
BaseクラスのprivateタイプのshowMe()メソッドはSubクラスに継承されないため,BaseクラスのshowMe()メソッドとSubクラスのshowMe()メソッドの間には上書き関係はない.
 
 
 
8.親の非静的メソッドは、クラスを静的メソッドとして上書きすることはできません.
 9. 親の抽象的な方法は布団類が2つの方法でカバーすることができる:1つは子類が親を実現する抽象的な方法である.2つ目は、子クラスが親クラスを再宣言する抽象的な方法です.
public abstract class Base {
    abstract void method1();
    abstract void method2();
}
public abstract class Sub extends Base {
    public void method1() {… …}			// method1() , 
    public abstract void method2();		// method2() , , 
}

 
10.親の非抽象メソッドは、クラスを抽象メソッドとして上書きすることができる.