Java 为什么m方法的可见性会以这种方式更改输出?我预料会发生相反的情况
标题编辑:“我的*方法”,所以问题的根源是方法pmA3。它在类A和类B中都存在。方法查找建议,当调用pmA3时,它将在类B中查找该方法,并在查找类A中的方法之前执行该方法。更改为public会得到预期的结果,但我不知道为什么。难道不是相反吗Java 为什么m方法的可见性会以这种方式更改输出?我预料会发生相反的情况,java,methods,visibility,private,lookup,Java,Methods,Visibility,Private,Lookup,标题编辑:“我的*方法”,所以问题的根源是方法pmA3。它在类A和类B中都存在。方法查找建议,当调用pmA3时,它将在类B中查找该方法,并在查找类A中的方法之前执行该方法。更改为public会得到预期的结果,但我不知道为什么。难道不是相反吗 public class Class { public static void main(String[] args) { B bVar = new B(); bVar.mA1(); bVar.mA2(
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");
}
}
说明私有方法不是继承的
实际上,类A
中对pmA3()
的调用是静态绑定的。也就是说,它是在编译时解决的。由于调用在类A
中,它将调用方法A#pmA3
当您将该方法声明为public时,上面提到的JLS段落告诉您,它现在是可继承的
因此,类a
中对pmA3()
的调用现在是动态绑定的。也就是说,编译器不解析要调用的具体方法,而是将其委托给运行时。在运行时,JVM查找调用该方法的对象的具体类型,以及该类型是否具有重写的方法。在您的情况下是这样的,因此将调用方法B#pmA3
。说明私有方法不会被继承
实际上,类A
中对pmA3()
的调用是静态绑定的。也就是说,它是在编译时解决的。由于调用在类A
中,它将调用方法A#pmA3
当您将该方法声明为public时,上面提到的JLS段落告诉您,它现在是可继承的
因此,类a
中对pmA3()
的调用现在是动态绑定的。也就是说,编译器不解析要调用的具体方法,而是将其委托给运行时。在运行时,JVM查找调用该方法的对象的具体类型,以及该类型是否具有重写的方法。在您的情况下是这样的,因此将调用方法B#pmA3
。您所说的“更改为公共”是什么意思?你没有展示一个不公开的案例。。。既然你从未调用过pmA3()
,你怎么能得到这个结果?你说的“更改为公共”是什么意思?你没有展示一个不公开的案例。。。既然你从未调用过pmA3()
,你怎么能得到这个结果呢?
Expected Results:
A
mA1 - B
mA2 - A
pmA3 - B
Actual Results:
A
mA1 - B
mA2 - A
pmA3 - A