Java:我可以覆盖父方法但使用不同的参数吗?

时间:2016-03-25 06:52:53

标签: java

有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是一样的吗?为什么不接受?

7 个答案:

答案 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是否相同?为什么不接受?

这是因为Integerint不一样。 Integer是一个类(int的Wrapper类)。可能看起来它们是相同的,因为Java会为您执行自动装箱拆箱。

自动装箱示例:

Integer i = 5;

拆箱示例:

int num = new Integer(5);

但实质上,它们是不同的类型。一个是类,另一个是原始类型。

  

我可以覆盖父方法但使用不同的参数吗?

覆盖的含义意味着您正在为 继承的方法 编写不同的实现。如果您使用其父级的不同方法签名。 Java如何知道你试图覆盖父方法?

因此,不可能使用不同的参数(方法签名)覆盖父方法。

实际上,当您尝试使用其他参数时,实际上是在进行方法重载(即通过不同的方法签名编写具有相同方法名称的方法)。

答案 5 :(得分:0)

  

int和Integer是对的吗?

Integer是原始int数据类型的包装类。

See the documentation here

答案 6 :(得分:0)

不,你不能覆盖父方法,但是使用不同的参数,如果你想覆盖任何父语句,你的声明将是相同的,但你可以改变行为。