有2个班级。父类有方法 - > public void abcd(int i)
和子类已覆盖 - > public void abcd(Integer i)
这是否可行,因为同样的方法名称,但在父类和Integer中使用的int已在子类中使用。
Practice.java
public class Practice {
public void abcd(int i){
System.out.println("Hi");
}
Practice2.java
public class Practice2 extends Practice{
public void abcd(Integer i){
System.out.println("oh child");
}
public static void main(String[] args) {
Practice p = new Practice();
Practice p2 = new Practice2();
p2.abcd(1); //Is this possible
}
}
我得到以下错误实践中的方法abcd()不适用于参数(int) int和Integer是一样的吗?为什么不接受?
答案 0 :(得分:5)
不,不可能。 According to the Java docs
要覆盖父方法,子节点必须使用相同的签名(名称,加上其参数的数量和类型)和返回类型(此处允许的协变返回类型)
答案 1 :(得分:1)
它不可能,你混合重载和覆盖,覆盖所需的相同方法名,相同的参数和相同的参数类型。
答案 2 :(得分:1)
我可以覆盖父方法但使用不同的参数吗?
不,这是不可能的。您需要覆盖方法,这意味着具有不同实现的相同方法,如果您更改参数或返回类型,则意味着您正在更改行为。
int和Integer是对的吗?
不,他们不一样。 Integer是一个类,int是基本类型。请参阅答案以获取详细信息here
答案 3 :(得分:1)
请注意,在子级中继承的方法必须具有父级方法签名的subsignature。
答案 4 :(得分:1)
得到以下错误实践中的方法abcd()不适用于参数(int)int和Integer是否相同?为什么不接受?
这是因为Integer
和int
不一样。 Integer是一个类(int的Wrapper类)。可能看起来它们是相同的,因为Java会为您执行自动装箱拆箱。
自动装箱示例:
Integer i = 5;
拆箱示例:
int num = new Integer(5);
但实质上,它们是不同的类型。一个是类,另一个是原始类型。
我可以覆盖父方法但使用不同的参数吗?
覆盖的含义意味着您正在为 继承的方法 编写不同的实现。如果您使用其父级的不同方法签名。 Java如何知道你试图覆盖父方法?
因此,不可能使用不同的参数(方法签名)覆盖父方法。
实际上,当您尝试使用其他参数时,实际上是在进行方法重载(即通过不同的方法签名编写具有相同方法名称的方法)。
答案 5 :(得分:0)
答案 6 :(得分:0)
不,你不能覆盖父方法,但是使用不同的参数,如果你想覆盖任何父语句,你的声明将是相同的,但你可以改变行为。