对JAVA中的多态和静态绑定感到困惑

问题描述 投票:0回答:1

我对java还是很陌生。所以我一边玩java一边阅读多态性和静态绑定。我来这里是为了澄清我的思考过程是否正确。

class A {
void foo(A a) {
                System.out.println("AAAAAA");
        }
}
class B extends A {
void foo(B a) {
                System.out.println("BBBBB");
        }
}

class C extends B{
        void foo (A a){
                System.out.println("CCCCCBBBB");
        }
}

我创建了以下名为“c”的对象,并以 c 作为参数调用 foo。

C c = new C();
c.foo(c); // the output is BBBBB

从这篇文章关于Java重载和动态绑定的问题,我了解到,如果在类中找不到发送的参数,它会将参数(在本例中为C)向上转换为在类中可以找到的参数(在此情况 A,因为

void foo (A a)
)。但如果是这样的话,它不应该打印“CCCCCBBBB”吗?通过静态绑定。

java polymorphism
1个回答
0
投票

C
有 2 个重载方法,名称为
foo

// defined in the class C
void foo (A a){
    System.out.println("CCCCCBBBB");
}

// inherited from the class B
void foo(B a) {
    System.out.println("BBBBB");
}

当我们使用类

foo
的参数调用方法
C
时,将选择最具体的一个 -
B
类在层次结构上比类
A
更接近,因此调用
foo(B)

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