2016-02-29 101 views
1

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

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)); 
    } 
} 
+4

'A'没有定义任何'f(int)'方法,所以显然在第二种情况下调用'f(long)'。代码中没有方法重写。 – Berger

回答

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。看看它是从什么类中调用的。

+0

好的,我明白了。谢谢! – fallobst22