gpt4 book ai didi

Java 重载解析 - 为什么 m(cast, cast) 而不是 m(match, cast)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:34:52 28 4
gpt4 key购买 nike

我很确定我不会是第一个被这个绊倒的人,但我找不到答案。这是作业。

class Tier{}

class Fisch extends Tier{}

class Vogel extends Tier{}

class Huhn extends Vogel{}

class Spatz extends Vogel{}

class Karpfen extends Fisch{}

class Super{
public void m(Tier t1, Tier t2){
System.out.println("1");
}

public void m(Tier t, Fisch f){
System.out.println("2");
}

public void m(Fisch f, Tier t){
System.out.println("5");
}
}

class Sub extends Super{
public void m(Tier t1, Fisch t2){
System.out.println("3");
}

public void m(Vogel v, Fisch f){
System.out.println("4");
}
}


public class TierTest{
public static void main(String[] args) {
Tier t1 = new Tier();
Tier t2 = new Vogel();
Fisch f = new Karpfen();
Vogel v1 = new Vogel();
Vogel v2 = new Spatz();
Huhn h = new Huhn();
Karpfen k = new Karpfen();

Super sup1 = new Super();
Super sup2 = new Sub();

sup1.m(h, v2);
sup2.m(v1, k); //4 expected, got 3
sup1.m(t1, t2);
sup1.m(v1, k);
sup1.m(v2, f);
sup2.m(v1, f); //4 expected, got 3
}
}

两次都是 Vogel(bird)(声明和运行时类型)和某种鱼。为什么选择 m(Tier, Fisch) 而不是 m(Vogel, Fisch)?

第一个参数将是一个完美的匹配。其余部分符合我的直觉。

抱歉,如果我太 NumPy 了,找不到类似的问题。

周末愉快斯蒂芬

最佳答案

这里:

Vogel v1 = new Vogel();                
Karpfen k = new Karpfen();
...
Super sup2 = new Sub();
...
sup2.m(v1, k); //4 expected, got 3

sup2 声明为 Super 类类型。
编译器选择的方法依赖于声明变量的类,而不是运行时实例。
因此,编译器会在 Super 类中寻找匹配的方法。

Super 类中,这些是 m() 潜在的候选方法:

public void m(Tier t1, Tier t2){
System.out.println("1");
}

public void m(Tier t, Fisch f){
System.out.println("2");
}

public void m(Fisch f, Tier t){
System.out.println("5");
}

编译器选择最具体的方法来匹配 v1k 参数声明类型:

选择这个方法:

public void m(Tier t, Fisch f){
System.out.println("2");
}

现在,在运行时,在运行时对象上调用方法(多态性原理)。
由于sup2变量引用的运行时类是Sub,调用Sub的重载方法:

public void m(Tier t1, Fisch t2){
System.out.println("3");
}

对于第二次调用:

sup2.m(v1, f);  //4 expected, got 3

完全一样的道理。

关于Java 重载解析 - 为什么 m(cast, cast) 而不是 m(match, cast),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44986018/

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