【问题标题】:Jave : Parent method is called when ambiguity in Inheritance [duplicate]Java:当继承中的歧义时调用父方法[重复]
【发布时间】:2017-10-24 16:15:16
【问题描述】:

考虑以下几点:

class Parent {
    public void print(Object s) {
        System.out.println("I am inside Parent Object Method.");
    }
}

public class Child extends Parent{

    public void print(String s) {
        System.out.println("I am inside Child String Method.");
    }

    public static void main(String arg[]) {
        Parent a = new Child();
        a.print(null);
    }
}

输出:

I am inside Parent Object Method

这里 JVM 调用父方法代替子方法,而不管“应该调用更具体的方法”的逻辑是否模糊。

在java中这个实现的原因是什么?

【问题讨论】:

  • 怎么模棱两可?你怎么能用接受字符串的方法调用a.print(1)
  • @Override 添加到 Child 的 print() 方法中。
  • 将 1 更改为 null 后,您的代码将打印“我在子字符串方法中。”。
  • 编辑了问题并传递了null,然后也传递了它的调用父方法。

标签: java inheritance


【解决方案1】:

这里没有涉及过度。涉及的是重载。调用 Object 的 Overloaded 方法导致传递值 1 转换为 Integer Object 并调用 Parent 类的 print 方法,因为它可用于 Child

这里没有歧义,因为您重载了具有不同类型的方法。

【讨论】:

    【解决方案2】:

    1 不是 String,并且不会自动转换为 String,因此无法将其传递给需要 String 参数的方法。

    因此public void print(Object s) 被执行,因为int 可以装箱成Integer,即Object

    如果您想执行public void print(String s),请尝试a.print("1"); 甚至a.print(null);

    【讨论】:

    • 如果我写 a.print(null); 那么它的调用父方法也是如此。
    • @SanchiGirotra 我刚刚自己测试过,它打印出“我在子字符串方法中。”,所以你一定在某个地方犯了错误。
    • 我的错误。编辑了问题:现在引用对象是父对象。
    • @SanchiGirotra 这是一个不同的问题。方法重载分辨率在编译时根据您为其调用方法的变量的编译时类型确定。因此编译器只能看到父类的方法。
    • 首先这里不是方法重载,而且在运行时也会调用子方法,但是为什么这里调用父方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2016-08-14
    • 1970-01-01
    • 2013-10-17
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多