繁体   English   中英

当我尝试使用具有相同名称和参数类型的两个方法时,为什么会出现编译错误?

[英]Why do I get a compilation error when I try to have two methods with the same name and parameter type?

如果我将byte更改为int我得到编译器错误。 你能解释一下这个问题吗?

public class A {
   protected int xy(int x) { return 0; }
}

class B extends A {
   protected long xy(int x) { return 0; } //this gives compilor error
   //protected long xy(byte x) { return 0; } // this works fine
}   

如果我将byte更改为int我得到编译器错误。

如果你这样做,你有这个:

public class A {
   protected int xy(int x) { return 0; }
}

class B extends A {
   protected long xy(int x) { return 0; }
}   

...而xy方法的唯一区别是它们的返回类型。 方法不能仅通过它们的返回类型来区分,这就是Java的定义方式。 考虑一下:

myInstance.xy(1);

应该拨打哪个xy long xy(int x)int xy(int x)

如果您的目标是覆盖 B xy ,那么您需要使其返回类型为int以匹配A#xy

虽然方法分别放在同一继承树中的不同类中,但是在类中不能有两个具有相同签名的方法。 即基类和子类

注意:只是返回类型不能使编译器理解方法的区别。 返回类型不是包含在方法签名以及

您正在尝试使用相同的名称和输入参数编写两个方法,这是不可能的。

请看以下两种方法:

float met(){
  return 4.5;
}

double met(){
  return 5.4;
}

如果我们写这条线的话

int x = (int)met();

会叫什么方法?

无法决定,因此不允许这种情况。

那是因为如果你将byte更改为int你将在base和sub类中使用相同签名的方法(相同的方法名和参数类型),因此返回类型也应该相同。 因为不是(int和long)它会给你错误

您可以仅通过参数和名称区分方法。

     both methods are in same class B

     b.xy(byte x) or b.xy(int x) is called for input xy(0) or xy(1)

重写方法应该返回一个类型,该类型可以替换overriden方法返回的类型

因为当您将byte更改为int ,调用该方法的实例不知道该方法的含义。 被覆盖的还是旧的?

这就是为什么它不允许具有相同的签名(方法名称,参数类型和参数数量)。 就像信息一样:返回类型不是签名的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM