class B{
public void print(String s){
System.out.println('B');
}
}
class D extends B{
public void print(Object o){
System.out.println('D');
}
}
.
.
.
public class TestB {
public static void main(String[] args) {
D d = new D();
d.print("Test");
}
}
大家好,我知道如何确定此 d.print 使用哪种打印方法及其原因吗? 我知道这里没有向上转换也没有方法覆盖。既然 Object 是 String 的超类,那么 print 方法是否可以在 D 类中使用?
据我了解,问题是关于这段代码的:
D d = new D();
d.print("Test");
这里方法
d.print()
将调用print(Object)
中的方法class D
。
我可以解释原因。
嗯,这是因为Java使用动态调度。这意味着调用的方法是在运行时根据被调用对象的实际类型确定的。
这样,被调用的对象就是
D
,即使它被分配给类型为 D
的变量。原因是 Java 对方法参数使用协变,这意味着子类对象可以传递给需要超类对象的方法参数。
这就是调用方法
d.print()
的原因,Java首先在print(Object)
中寻找方法class D
。它会找到一个,因此该方法将被调用。
尽管
print(String
中的方法 class B
) 更具体,但它不会被调用,因为它是在 D
的超类中定义的。 Java 将仅调用在被调用对象的类或其超类之一中定义的方法。
P.s. 如果您还有其他问题,请告诉我。