2

次の状況に気付きました: 内部クラスは、そのスーパー クラスと外部クラスにあるメソッドを呼び出しています。ここにコード:

 public class Main
    {

        class Inner extends InnerBase{
           public void callMethod(){
               method();
           }
        }

        void method(){
            System.out.println ("Called Main's method");
        }

        class InnerBase{
            void method(){
                System.out.println ("Called InnerBase's method");
            }
        }
    }

callMethod() が呼び出されると、スーパークラスのメソッドが呼び出され、「Called InnerBase's method」が出力されます。callMethod() で呼び出している method() で IDE (Eclipse) から 'Open Declaration' を実行しようとすると、外部クラスのメソッドに移動します。どちらが本物と呼んでいるのか混乱します。外部クラスとスーパークラスで同じ名前の実行メソッドを選択する状況を説明する資料を提案または提供できますか。前もって感謝します。

4

3 に答える 3

5

修飾されたthis(JLS§15.8.4。修飾されたthis)を使用することにより、選択したメソッドが何であるかを疑いなく指定できます。

public void callMethod()
{
    Main.this.method();
}

ルールは単純です。常に最も近い方法を選択します。

InnerBase.method()独自のメソッドの一部です。は別の無関係なクラスの一部であるMain.method()ため、これは、よりも近くなります。Main.method()に別のmethod()メソッドInnerがある場合、同じクラスにあるため、そのメソッドが選択されます。

于 2012-12-06T13:14:06.870 に答える
2

Mainここには 、 、Innerおよびの 3 つのクラスがありInnerBaseます。Innerは のですがInnerBaseMainそれらとはまったく関係ありません。そのため、callMethod()onを呼び出すと、継承元の OWN実装をInnerBaseofc で呼び出します。method()InnerBase

Mainsを呼び出したい場合method()は、明示的に修飾する必要があります。

Eclipse が間違ったメソッドにジャンプする場合は、Eclipse のエラーである可能性が最も高いです。

于 2012-12-06T13:16:12.630 に答える
2

「修飾されたこれ」を使用して。

Main.this.method()

見る

Javaで「これを修飾した」構造はどういう意味ですか?

于 2012-12-06T13:18:31.180 に答える