-2

所以我有一个看起来与此类似的问题:

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() 并看到我们实际上正在使用超类实例化。

无论如何,当我们运行应用程序时,出于某种原因,它使用的是方法的子类副本而不是超类,尽管对象是超类的实例(即,它甚至不应该知道子类方法)。这是我和我的同事不知道的已知事情吗?我们完全不知道为什么会发生这种情况。

4

2 回答 2

0

简而言之,唯一可能导致这种情况的是运行时对象是 B 的一个实例,但您将其声明为 A。当调用该方法时,您的程序将开始查看它所在对象的运行时类调用,然后沿着继承树向上工作。

附带说明一下,您缺少构造函数,您的 B 类扩展了一个包,并且您的方法没有返回类型。那是完全无效的Java。

于 2012-04-12T19:59:44.480 回答
0

可能导致这种混淆的一件事是有一个与其超类B同名的子类(AA

除此之外,它看起来像一个分析错误。追溯你的步骤。一些想法:删除类B或使其不可实例化,然后重新引入它并再次对其进行测试。

于 2012-04-12T20:03:43.413 回答