Java 为什么m方法的可见性会以这种方式更改输出?我预料会发生相反的情况

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(

标题编辑:“我的*方法”,所以问题的根源是方法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");
    }
}

说明私有方法不是继承的

实际上,类
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