【问题标题】:Java virtual function callsJava 虚函数调用
【发布时间】:2016-06-12 18:47:36
【问题描述】:

据我了解,Java 中的所有函数调用都是虚拟的,而数字文字的类型为 int。但是为什么下例中的输出不同呢?

public class A {
    public int f(long d) {
        return 2;
    }
}
public class B extends A {
    public int f(int d) {
        return 1;
    }
}
public class M {
    public static void main(String[] args) {
        B b = new B();
        A ab = b;
        System.out.println(b.f(1));
        System.out.println(ab.f(1));
    }
}

【问题讨论】:

  • A 没有定义任何f(int) 方法,所以很明显,f(long) 在第二种情况下被调用。您的代码中没有方法覆盖。

标签: java function virtual


【解决方案1】:

你不会覆盖任何东西。

  • 第一次调用System.out.println(b.f(1));返回1,因为它与class B一起工作,即使方法名称相同,但参数不同(longint不同)。

  • 如果参数相同(int d),则结果将是1,因为它会覆盖(@Overrideclass A 中的方法。

  • 现在,您知道为什么第二次调用System.out.println(ab.f(1)); 返回2。看看它是从哪个类调用的。

【讨论】:

    【解决方案2】:

    实际上子类 B 继承了方法 f(with a long) 并添加(重载)了另一个方法 f(with a int)。 当您以这种方式写下诸如 1 之类的值时,编译器即使在将其分配给类型化引用之前也会将其解析为 int。更多信息:Java's L number (long) specification

    当您使用引用 ab(它是 A 类)调用方法 f 时,它(引用)说我只能将您发送到方法 f(带有 long)然后隐式地将类型 int 1 转换为 long .

    我们试着把A类中方法的类型改成f(short), 然后 System.out.println(ab.f(1));会给你这个错误: "A 类型中的方法 f(short) 不适用于参数 (int)"

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2015-09-17
      • 2018-11-09
      • 2011-08-06
      • 2012-01-28
      • 2021-07-07
      • 1970-01-01
      相关资源
      最近更新 更多