【问题标题】:Java: Can I override parent method but with different parameter?Java:我可以用不同的参数覆盖父方法吗?
【发布时间】:2016-07-12 22:35:02
【问题描述】:

有 2 个班级。父类有方法 --> public void abcd(int i) 子类有覆盖 -->public void abcd(Integer i)

这是否可能,因为父类中使用了相同的方法名称但 int 和 Integer 我已在子类中使用。

实践.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() 不适用于 arguments(int) int 和 Integer 是一样的吗?为什么不接受?

【问题讨论】:

  • 抱歉问了这么愚蠢的问题,我已经在谷歌搜索过了。没有找到合适的解决方案。
  • 您从哪里得知“int 和 Integer 相同”?请在发布问题之前进行一些研究。

标签: java


【解决方案1】:

不,这是不可能的。 According to the Java docs

要覆盖父方法,子方法必须使用相同的签名(名称,加上其参数的数量和类型)和返回类型(此处允许协变返回类型)

【讨论】:

    【解决方案2】:

    这是不可能的,你正在混合重载和覆盖,覆盖所需的相同方法名称、相同参数和相同参数类型。

    【讨论】:

      【解决方案3】:

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

      不,这是不可能的。您需要覆盖该方法,这意味着相同的方法具有不同的实现,如果您更改参数或返回类型,则意味着您正在更改行为。

      int 和 Integer 是一样的吧?

      不,它们不一样。 Integer 是一个类,而 int 是一个原始类型。有关详细信息,请参阅答案。 here

      【讨论】:

        【解决方案4】:

        int 和 Integer 是一样的吧?

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

        See the documentation here

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            请注意,子级继承的方法必须具有父级方法签名的subsignature

            【讨论】:

              【解决方案7】:

              得到以下错误实践中的方法abcd()不适用于arguments(int)int和Integer是一样的吗?为什么不接受?

              这是因为Integerint 不一样。整数是一个类(int 的包装类)。它们可能看起来是一样的,因为 Java 为您做了一些称为自动装箱拆箱的事情。

              自动装箱示例:

              Integer i = 5;
              

              拆箱示例:

              int num = new Integer(5);
              

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


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

              override 的意思是你正在为一个继承的方法写一个不同的实现。如果您使用与其父级不同的方法签名。 Java 怎么知道你试图覆盖父方法?

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

              事实上,当你尝试使用不同的参数时,你实际上是在做一个方法重载(即用不同的方法签名写一个方法名相同的方法)。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多