所以我有一个看起来与此类似的问题:
package com.blah.A_package;
public class A
{
public void f() {
g();
}
protected void g() {
System.out.println("superclass g()");
}
}
package com.blah.B_package;
public class B extends com.blah.A_package.A
{
protected void g() {
System.out.println("subclass g()");
}
}
public static void main(String[] args)
{
A scratch = new A();
scratch.f();
}
运行时,它会打印出“子类 g()”而不是预期的“超类 g()”。
我们实际上是在创建超类和子类的对象(这是通过 jar 上的反射),将它们粘贴到地图中,然后根据需要将它们拉出,但我们通过打印出 object.getClass 进行了验证().getName() 并看到我们实际上正在使用超类实例化。
无论如何,当我们运行应用程序时,出于某种原因,它使用的是方法的子类副本而不是超类,尽管对象是超类的实例(即,它甚至不应该知道子类方法)。这是我和我的同事不知道的已知事情吗?我们完全不知道为什么会发生这种情况。