gpt4 book ai didi

java - 为什么 m 方法的可见性会以这种方式改变输出?我预计会发生相反的情况

转载 作者:行者123 更新时间:2023-12-02 01:33:35 25 4
gpt4 key购买 nike

标题编辑:“my* method” 所以问题的根源是方法pmA3。它同时存在于 A 类和 B 类中。方法查找表明,当调用 pmA3 时,它将查找 B 类中的方法并在查找 A 类中的方法之前执行该方法。更改为 public 会得到预期的结果结果,但我不知道为什么。难道不应该反过来吗?

public class Class {
public static void main(String[] args) {
B bVar = new B();
bVar.mA1();
bVar.mA2();
}
}
class A {
public A() {
System.out.println("A");
}
private void pmA3() {
System.out.println("pmA3 - A");
}
public void mA1() {
System.out.println("mA1 - A");

}
public void mA2() {
System.out.println("mA2 - A");
pmA3();
}


}
class B extends A {
public void pmA3() {
System.out.println("pmA3 - B");
}
public void mA1() {
System.out.println("mA1 - B");
}
public void mB1() {
System.out.println("mB1 - B");
}
}

Expected Results:

A
mA1 - B
mA2 - A
pmA3 - B

Actual Results:

A
mA1 - B
mA2 - A
pmA3 - A

最佳答案

JLS §8.4.8解释了私有(private)方法不能被继承。

事实上,A 类中对 pmA3() 的调用是静态绑定(bind)的。 IE。它在编译时得到解决。由于调用是在类 A 内部进行的,因此它将调用方法 A#pmA3

当您将该方法声明为公共(public)时,上面提到的 JLS 段落告诉您,它现在是可继承的。

因此,A 类中对 pmA3() 的调用现在动态绑定(bind)。 IE。编译器不会解析要调用的具体方法,而是将其委托(delegate)给运行时。在运行时,JVM 会查找调用该方法的对象的具体类型以及该类型是否具有重写的方法。在您的情况下,因此将调用方法 B#pmA3

关于java - 为什么 m 方法的可见性会以这种方式改变输出?我预计会发生相反的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55628162/

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