Java虚函数调用

时间:2016-02-29 16:24:36

标签: java function virtual

根据我的理解,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));
    }
}

2 个答案:

答案 0 :(得分:1)

你不要覆盖任何东西。

  • 第一次调用System.out.println(b.f(1));会返回1,因为它与class B一起使用,即使该方法命名相同,但参数不同(long不是与int)相同。

  • 如果参数相同(int d),结果将为1,因为它会覆盖(@Override} class A的方法。

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

答案 1 :(得分:0)

实际上子类 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)"