このメソッドがあるとしましょう
public class Animal {
public void eat() { }
}
Animal を拡張する別のクラスには、このメソッドがあります
public String eat(){}
これはメソッドのオーバーライドと見なされますか? 同じメソッド引数を持っていれば、メソッドのオーバーライドで異なる戻り値の型を使用できると聞いたので
このメソッドがあるとしましょう
public class Animal {
public void eat() { }
}
Animal を拡張する別のクラスには、このメソッドがあります
public String eat(){}
これはメソッドのオーバーライドと見なされますか? 同じメソッド引数を持っていれば、メソッドのオーバーライドで異なる戻り値の型を使用できると聞いたので
これはオーバーロードでもオーバーライドでもありません。コンパイルエラーです。
Java では、パラメーター宣言が異なる限り、同じ名前を共有する同じクラス内に 2 つ以上のメソッドを定義することができます。この場合、メソッドはオーバーロードされていると言われ、プロセスはメソッドのオーバーロードと呼ばれます。
以下は、メソッドをオーバーライドする際に従う必要がある Java でのメソッドオーバーライドのルールです。private、static、および final メソッドはオーバーライドできません。
1) メソッド シグネチャは、戻り値の型、メソッド パラメーターの数、パラメーターの型、およびパラメーターの順序を含めて同じである必要があります。
2) オーバーライド メソッドは、元のメソッドまたはオーバーライドされたメソッドよりも高い例外をスローできません。このルールは、Java のチェック済み例外にのみ適用されます。オーバーライドされたメソッドは、未チェックの例外を自由にスローできます。
3)メソッドをオーバーライドしても、オーバーライドされたメソッドのアクセシビリティを低下させることはできません。つまり、元のメソッドまたはオーバーライドされたメソッドがパブリックである場合、メソッドをオーバーライドしても保護できないことを意味します。
戻り値の型は、元の戻り値の型のサブクラスにのみ変更できます。
これは正しいコードではありません。同じ名前の 2 つのメソッドは同じ値を返す必要があるため、引数のみが異なる可能性があります オーバーライドはサブクラスで同じ引数を持つ同じメソッドを持っています 異なる引数を持つ同じメソッド名を持つオーバーロード
メソッドの戻り値の型は、そのメソッドのシグネチャの一部ではありません。
eat()
サブクラスを呼び出すと、Java は提供されたシグネチャを (eat
パラメーターなしで) 調べ、このシグネチャを持つメソッドを探し始めます。これは、呼び出したオブジェクトのインスタンス型のクラスから始まります (そして、その祖先を検索します)。見つからない場合)。
そのため、サブクラスで呼び出されたメソッドは、オーバーライドされたメソッドを常に実行します (それらが最初に見つかります)。
OO (具体的にはポリモーフィズム) の重要な「ポイント」は、スーパークラスが期待されていた場所にサブクラスを渡すことができることです。メソッドがスーパークラスのメソッドを呼び出して void を取得したいが、String を返すeat()
サブクラスをそのメソッドに渡した場合。eat()
メソッドがサブクラスの eat を呼び出し、予期しない値を取得することがわかります。
これが問題になる理由がわかります。:私
したがって、オーバーライド メソッドは、同じ型または親によって返される型のサブクラスを返す必要があります。(サブクラスを返すことができる理由についても同様の原則が適用されます。それについては考えさせてください c: )