将选择一种方法

时间:2015-08-20 23:04:16

标签: java inheritance overloading

我有两个java类。

class A {}
class B extends A {}

我有接受这些类的类,但需要不同的实现方法。

class Holder {
     public void accept(A a) {} // choice 1
     public void accept(B b) {} //choice 2
}

如果我提供一个B对象的持有者,它会选择哪种方法?

查看代码我会选择2,但是由于继承,选择1也可以接受。

那么谁能告诉我这个运行时逻辑?

1 个答案:

答案 0 :(得分:6)

在所有情况下,都会调用最具体的方法。

如果传递的对象的类型B,那么将调用B方法,但是如果将B实例分配给类型为A的变量,将调用A方法:

A obj = new B();
accept(obj);  // will invoke the A method

对象的运行时类型不用于绑定到方法,因为Java是静态类型的语言,方法绑定是在编译时完成的。