-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

この混乱を引き起こす原因の 1 つは、スーパークラス ( )Bと同じ名前ののサブクラスあるが、スーパークラスのパッケージと似た名前の別のパッケージにあることです。AA

それとは別に、分析エラーのように見えます。あなたの歩みをたどってください。いくつかのアイデア: クラスを削除するBか、インスタンス化できないようにしてから、再導入してすべてをもう一度テストします。

于 2012-04-12T20:03:43.413 に答える