参数顺序 - 覆盖

时间:2013-04-23 19:04:19

标签: java

根据javadoc

  

具有相同签名的子类中的实例方法(name,plus   它的参数的数量和类型)和返回类型   超类中的instance方法会覆盖超类的方法。

我的问题是 - 参数的顺序是无关紧要的吗?如果它们有相同的名称,它们也是同一类型?

7 个答案:

答案 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具有相同的参数类型:

     
      
  1. 它们具有相同数量的形式参数(可能为零)
  2.   
  3. 它们具有相同数量的类型参数(可能为零)
  4.   
  5. 设A 1 ,...,A n 为M的类型参数,让B 1 ,...,B n 是N的类型参数。将N的类型中B i 的每次出现重命名为A i 后,相应类型变量的边界是相同的,M和N的形式参数类型是相同的。
  6.         

    ...

         

    如果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

相关问题