javadocによると
スーパークラスのインスタンス メソッドと同じシグネチャ (名前とそのパラメータの数と型) と戻り値の型を持つサブクラスのインスタンス メソッドは、スーパークラスのメソッドをオーバーライドします。
私の質問は - パラメータの順序は重要ではありませんか? 同じ名前で同じタイプの場合は?
javadocによると
スーパークラスのインスタンス メソッドと同じシグネチャ (名前とそのパラメータの数と型) と戻り値の型を持つサブクラスのインスタンス メソッドは、スーパークラスのメソッドをオーバーライドします。
私の質問は - パラメータの順序は重要ではありませんか? 同じ名前で同じタイプの場合は?
順序は重要であるため、順序が異なる同じ引数を持つ 2 つのメソッドは、同じシグネチャを持つとは見なされません。
たとえば、次の例はコンパイルされません。
interface Foo {
void doIt(String what, int times);
}
class Bar implements Foo {
public void doIt(int times, String what) {}
}
ただし、パラメーターの名前は関係ありません。これはまったく問題ありません。
interface Foo {
void doIt(String what, int times);
}
class Bar implements Foo {
public void doIt(String andNowForSomeThingCompetelyDifferent, int theLarch) {}
}
Java 言語仕様では、順序は重要であると述べていますが、その理由を説明するには、いくつかのヒントが必要です。
8.4.1. 仮パラメータ
メソッドまたはコンストラクターの仮パラメーターがある場合は、コンマで区切られたパラメーター指定子のリストによって指定されます。
...
8.4.2. メソッド署名
次の条件がすべて満たされる場合、2 つのメソッドまたはコンストラクタ宣言 M と N は同じ引数の型を持ちます。
- それらは同じ数の仮パラメータを持っています (ゼロの可能性があります)
- それらは同じ数の型パラメーターを持っています (おそらくゼロ)
- A 1 , ..., A nを M の型パラメーターとし、B 1 , ..., B nをNの型パラメーターとする。対応する型変数の境界は同じであり、M と N の仮パラメーターの型は同じです。
...
2 つのメソッド シグネチャ m1 と m2 は、m1 が m2 のサブシグネチャであるか、m2 が m1 のサブシグネチャである場合、オーバーライド等価です。
仮パラメータはリストとして指定されるため、「M と N の仮パラメータの型」が同じであるためには、それらは同じリストでなければならず、リストは順序に依存します。
3 の対応は順序に依存するため、型パラメーターの順序も重要です。
これは、 Method Descriptorsのバイトコード/JNI 規則を扱うと、より明白になります。
MethodDescriptor: ( ParameterDescriptor* ) ReturnDescriptor
順序も同じである必要があります。そうでない場合、オーバーライドは行われません
いいえ、順序は重要です。
Java でメソッドをオーバーライドするための規則
規則 1) 別のクラスを拡張するクラスが同じ名前と引数リストを持つメソッドを定義する場合、そのメソッドはオーバーライドされると言われます。
ルール 2) 基本クラスで定義されたメソッドは、派生クラスで可視である必要があります。そうでない場合、派生クラスのメソッドはオーバーライドされたバージョンとは見なされず、通常のメソッドとして扱われます。
ルール 3) メソッド名と引数リストは、オーバーライドするメソッドとオーバーライドされるメソッドで同じにする必要があります。ただし、戻り値の型は共変になる可能性があります。これは、スーパー クラスのメソッドの戻り値の型が Map の場合、同じメソッドの戻り値の型が HashMap になる可能性があることを意味します。
ルール 4) オーバーライド メソッド (派生クラス) のアクセス指定子は、オーバーライドされたメソッド (基本クラス) のアクセス指定子よりも制限的であってはなりません。これは、基本クラス メソッドのアクセス指定子が保護されている場合、派生クラス メソッドのアクセス指定子はデフォルトまたはプライベートであってはならず、保護されたパブリックにすることができることを意味します。さまざまな指定子の可視性を高める順序は次のとおりです。
プライベート、デフォルト、保護、公開
規則 5) 派生クラス メソッドで指定された例外は、同じか、それらのサブクラスである必要があります。したがって、基本クラス メソッドが例外を throws 節で IOException として指定する場合、派生クラス メソッドは例外を FileNotFoundException、IOException として指定できますが、Exception として指定することはできません。
順序が重要です。順番が違えばサインも違う。
public void foo(int x, Object y)
で上書きすることはできません
public void foo(Object y, int x)
順序が同じでない場合、コンパイラはメソッドを見つけることができず、そのようなエラーが表示されます
複数のパラメーターを使用する場合、メソッド呼び出しにはパラメーターと同じ数の引数が必要であり、引数は同じ順序で渡される必要があることに注意してください。
ソース: https://www.w3schools.com/java/java_methods_param.asp