Java多态继承

问题描述 投票:0回答:1
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 类中使用?

java inheritance polymorphism
1个回答
0
投票

据我了解,问题是关于这段代码的:

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. 如果您还有其他问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.