gpt4 book ai didi

java - 静态和动态绑定(bind)歧义

转载 作者:行者123 更新时间:2023-12-01 13:46:23 26 4
gpt4 key购买 nike

我有以下代码:

class A{
public void print(A a){
System.out.println("A 1");
}
}

class B extends A{
public void print(A a){
System.out.println("B 1");
}
public void print(B b){
System.out.println("B 2");
}
}

class C extends B{
public void print(A a){
System.out.println("C 1");
}
public void print(B b){
System.out.println("C 2");
}
public void print(C c){
System.out.println("C 3");
}
}

class D extends C{
public void print(A a){
System.out.println("D 1");
}
public void print(B b){
System.out.println("D 2");
}
public void print(C c){
System.out.println("D 3");
}
public void print(D d){
System.out.println("D 4");
}
}

public class Test{
public static void main(String args[]){
B inst = new C();
inst.print(new D());
}
}

输出是 C 2,但我不明白为什么。好的,我明白了,由于动态绑定(bind),将调用 C 类中的方法。那么为什么它选择第二种方法呢?为什么它不选择第一个?

最佳答案

由于inst被声明为类型B,唯一可见的方法是对B可见的方法

class B extends A{
// @Override
public void print(A a){
System.out.println("B 1");
}
public void print(B b){
System.out.println("B 2");
}
}

通过方法重载,the method with the most specific possible arguments is chosen.在本例中,即 print(B)。由于多态性或动态绑定(bind),Cprint(B) 将被调用。

关于java - 静态和动态绑定(bind)歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20342162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com