gpt4 book ai didi

Java动态绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 19:44:40 25 4
gpt4 key购买 nike

我正在为考试练习,发现一道样题让我完全迷失了方向。对于以下代码,找出输出是什么:

class Moe {
public void print(Moe p) {
System.out.println("Moe 1\n");
}
}
class Larry extends Moe {
public void print(Moe p) {
System.out.println("Larry 1\n");
}
public void print(Larry l) {
System.out.println("Larry 2\n");
}
}
class Curly extends Larry {
public void print(Moe p) {
System.out.println("Curly 1\n");
}
public void print(Larry l) {
System.out.println("Curly 2\n");
}
public void print(Curly b) {
System.out.println("Curly 3\n");
}
}
public class Overloading_Final_Exam {
public static void main (String [] args) {
Larry stooge1 = new Curly();
Moe stooge2 = new Larry();
Moe stooge3 = new Curly();
Curly stooge4 = new Curly();
Larry stooge5 = new Larry();
stooge1.print(new Moe());
((Curly)stooge1).print(new Larry());
((Larry)stooge2).print(new Moe());
stooge2.print(new Curly());
stooge3.print(new Curly());
stooge3.print(new Moe());
stooge3.print(new Larry());
((Curly)stooge3).print(new Larry());
((Curly)stooge3).print(new Curly());
stooge4.print(new Curly());
stooge4.print(new Moe());
stooge4.print(new Larry());
stooge5.print(new Curly());
stooge5.print(new Larry());
stooge5.print(new Moe());
}
}

我心里有我的想法,但是当我运行 java 时,我得到了完全不同的东西:

Curly 1Curly 2Larry 1Larry 1Curly 1Curly 1Curly 1Curly 2Curly 3Curly 3Curly 1Curly 2Larry 2Larry 2Larry 1

前几个还行,后面就真的没看懂了。有人对这个问题有很好的解释吗?

谢谢

最佳答案

我会先画一幅画...

Moe - print(Moe)
|
Larry - print(Moe), print(Larry)
|
Curly - print(Moe), print(Larry), print(Curly)

然后我会跟踪变量:

  • Larry - stooge1 -> Curly
  • Moe - stooge2 -> Larry
  • Moe - stooge3 -> Curly
  • Curly - stooge4 -> Curly
  • 拉里 - stooge5 -> 拉里

  • stooge1.print(new Moe())

    • stooge1 -> Curly 调用 Curly.print(Moe)
  • ((Curly)stooge1).print(new Larry());

    • stooge1 -> Curly 调用 Curly.print(new Larry())
  • ((Larry)stooge2).print(new Moe());

    • stooge2 -> Larry 调用 Larry.print(new Moe());
  • stooge2.print(new Curly());
    好吧,这是它变得有点棘手的地方(抱歉我在这里之前停止了一个)

    • stooge2 被宣布为 Moe。因此,当编译器查看要调用的内容时,它将调用 print(Moe) 方法。然后在运行时它知道 stooge2 是 Larry,因此它调用 Larry.print(Moe) 方法。

等...

如果完全遵循该方法对您来说效果不佳,请告诉我。

(更新以澄清下一个)

所以一般规则是:

  • 编译器查看变量类型来决定调用什么方法。
  • 运行时查看变量指向的实际类,以决定从何处获取方法。

所以当你有:

Moe stooge2 = new Larry();
stooge2.print(new Moe());

编译器说:

  • Larry 可以分配给 stooge2 吗? (是的,因为 Larry 是 Moe 的子类)
  • Moe 有 print(Moe) 方法吗? (是)

运行时说:

  • 我应该在此对象上调用 print(Moe) 方法... stooge2
  • stooge2 指着拉里。
  • 我将在 Larry 类中调用 print(Moe) 方法。

一旦你解决了所有这些问题,尝试摆脱一些方法,看看这会如何改变。

关于Java动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/648903/

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