将选择一种方法

Tsc*_*cka 3 java inheritance overloading

我有两个java类.

class A {}
class B extends A {}
Run Code Online (Sandbox Code Playgroud)

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

class Holder {
     public void accept(A a) {} // choice 1
     public void accept(B b) {} //choice 2
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Boh*_*ian 6

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

如果传递的对象的类型B,则将B调用该方法,但如果将B实例分配给类型的变量,则将调用AA方法:

A obj = new B();
accept(obj);  // will invoke the A method
Run Code Online (Sandbox Code Playgroud)

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