根据javadoc
具有相同签名的子类中的实例方法(name,plus 它的参数的数量和类型)和返回类型 超类中的instance方法会覆盖超类的方法。
我的问题是 - 参数的顺序是无关紧要的吗?如果它们有相同的名称,它们也是同一类型?
答案 0 :(得分:5)
顺序很重要,因此两个具有不同顺序的相同参数的方法不被视为具有相同的签名 例如,此示例不编译:
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) {}
}
答案 1 :(得分:2)
Java Language Specification说订单很重要,但需要一些戏弄才能解释原因:
8.4.1。形式参数
方法或构造函数的形式参数(如果有)由逗号分隔的参数说明符列表指定。
...
8.4.2。方法签名
如果满足以下所有条件,则两个方法或构造函数声明M和N具有相同的参数类型:
- 它们具有相同数量的形式参数(可能为零)
- 它们具有相同数量的类型参数(可能为零)
- 设A 1 ,...,A n 为M的类型参数,让B 1 ,...,B n 是N的类型参数。将N的类型中B i 的每次出现重命名为A i 后,相应类型变量的边界是相同的,M和N的形式参数类型是相同的。
醇>...
如果m1是m2的子签名或m2是m1的子签名,则两个方法签名m1和m2是覆盖等价的。
形式参数被指定为列表,因此对于“M和N的形式参数类型”是相同的,它们必须是相同的列表,并且列表是依赖于顺序的。
由于3中的对应性依赖于顺序,因此类型参数的顺序也很重要。
当你处理Method Descriptors的字节码/ JNI约定时,这变得更加明显。
MethodDescriptor: ( ParameterDescriptor* ) ReturnDescriptor
答案 2 :(得分:1)
订单也必须相同,否则不会发生覆盖
答案 3 :(得分:1)
用Java重写方法的规则
规则1)如果扩展另一个类的类定义具有相同名称和参数列表的方法,则称该方法被覆盖。
规则2)基类中定义的方法应该在派生类中可见。如果不是这样,派生类中的方法将不被视为重写版本,但将被视为普通方法。
规则3)对于覆盖和重写方法,方法名称和参数列表应该相同。但是返回类型可以是共变体。这意味着如果超类中方法的返回类型是 Map,那么同一方法的返回类型可以是HashMap。
规则4)重写方法(在派生类中)中的访问说明符不应该比重写方法(在基类中)更具限制性。这意味着如果基类方法的访问说明符受到保护,那么派生类方法的访问说明符不应该是默认的或私有的,但可以是受保护的,公共的。增加各种说明符可见性的顺序是:
私人,默认,受保护,公开
规则5)派生类方法中指定的异常应该是它们的相同或子类。因此,如果基类方法在throws子句中将异常指定为IOException,则派生类方法可以将异常指定为FileNotFoundException,IOException但不是Exception。
答案 4 :(得分:0)
订单很重要。如果订单不同,签名会有所不同。
public void foo(int x, Object y)
无法被覆盖
public void foo(Object y, int x)
答案 5 :(得分:0)
如果订单不一样,编译器将无法找到该方法,您将收到错误说明
答案 6 :(得分:0)
请注意,当您使用多个参数时,方法调用必须具有与参数相同数量的参数,并且必须以相同的顺序传递参数。
来源:https://www.w3schools.com/java/java_methods_param.asp