サブクラスがオーバーロードされたメソッドを呼び出すと例外が発生するのはなぜですか?
オブジェクト指向プログラミングでは、オーバーロードとは、同じクラス内で複数のメソッドを定義することを指します。これらのメソッドは同じ名前ですが、異なる機能実装を実現するために異なるパラメーター リストを持ちます。サブクラスが親クラスを継承する場合、サブクラス内に同名のメソッドのオーバーロードがあると例外が発生することがあります。
サブクラスがオーバーロードされたメソッドを呼び出すときに例外がスローされる理由をより具体的に説明するために、次のコード例を見てみましょう:
class Parent { void display() { System.out.println("Parent class display method"); } void display(int num) { System.out.println("Parent class display method with parameter"); } } class Child extends Parent { void display() { System.out.println("Child class display method"); } } public class Main { public static void main(String[] args) { Parent parent = new Child(); parent.display(); parent.display(10); } }
上記のコードでは、親クラス ## を定義します。 #Parent とサブクラス
Child。親クラスには 2 つのオーバーロードされた
display メソッドがあり、パラメーターのないバージョンと整数パラメーターのあるバージョンです。サブクラス
Child は親クラス
Parent から継承し、親クラスの
display メソッドをオーバーライドします。
Main クラスで、親クラスからサブクラスのオブジェクトへの参照を作成します。次に、
display メソッドと
display(int num) メソッドをそれぞれ呼び出してみます。ポリモーフィズムの原理によれば、参照変数は親クラス型であり、実際のオブジェクトはサブクラス型であるため、サブクラス
Child 内のメソッドを呼び出す必要があります。
display メソッドのみが呼び出され、
display(int num)## の呼び出し時にコンパイル エラーが発生することがわかります。 # 方法。これは、継承関係において、サブクラスが親クラスのメソッドをオーバーライドする場合、親クラスのメソッドは上書きされず、新しいオーバーロードされたメソッドが追加されるだけであるためです。したがって、オーバーロードされたメソッドが親クラス参照を通じて呼び出される場合、コンパイラは、子クラスのオーバーロードされたメソッドではなく、親クラスで定義されたメソッドを呼び出すことを選択します。 この問題を解決するには、親クラスのメソッドを
として宣言するか、親クラスのすべてのメソッドを子クラスでオーバーロードして、子が確実に呼び出されるようにします。例外をスローしないクラス内のメソッド。 要約すると、継承関係において、親クラスのメソッドをオーバーロードしているサブクラスは親クラスのメソッドをオーバーライドしないため、サブクラスがオーバーロードされたメソッドを呼び出すと例外がスローされます。そのため、次の場合に注意する必要があります。この状況を回避するために使用します。
以上がサブクラスがオーバーロードされたメソッドを呼び出すと例外が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。