[英]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.