1

したがって、Java では、静的メソッドがある場合ClassName.method()、インスタンス メソッドの場合と同じ構造を使用するのではなく、次の形式で呼び出す必要があることを知っています。

ClassName myObject = new ClassName();
myObject.method();

ただし、この方法で実行した場合でも、有効なコードであり、機能します。問題のメソッドが静的で、次の設定がある場合にこれを行うことにしたとしましょう。

public SuperClass {
    public static int foo(int x) {
        return x;
    }
}

public SubClass extends SuperClass {
    public static int foo(int x) { // Overriding foo() in SuperClass
        return x + 1;
    }
}

public MyDriver {
    public static void main(String[] args) {
        SuperClass myObject = new SubClass(); // Upcasting.
        System.out.println(myObject.foo(5));  // This should polymorphically print 6
    }
}

ただし、画面に表示されるのは 6 ではなく 5 です。なぜですか?

4

4 に答える 4

1

静的メソッドはインスタンスに依存せず、クラスに属し、クラスにのみ属します。実際、静的メソッドがある場合は、常に 1 つの一意のインスタンスに常にアクセスします。

   myObject.foo(5) 

はショートカットにすぎません。実際に行っているのは

   SuperClass.foo(5)
于 2013-08-04T03:33:29.833 に答える
1

クラスのインスタンスを使用してそのクラスの静的メソッドを呼び出すことは、混乱を招く可能性があるため、避ける必要があります。メソッドをポリモーフィックに呼び出す必要がある場合は、インスタンス メソッドにします。静的メソッドをポリモーフィックに呼び出すことはできません。SuperClass 呼び出しが呼び出される理由は、それがコンパイル時の myObject の明らかなクラスであるためです。この効果は、次のシナリオでも見られます。

public void doSomething(SuperClass param) {
    System.out.println("SuperClass");
}

public void doSomething(SubClass param) {
    System.out.println("SubClass");
}

public void test() {
    SuperClass myObject = new SubClass();
    doSomething(myObject);
}

test() が呼び出されると、SuperClass出力されます。

于 2013-08-04T03:38:46.487 に答える
0

静的メソッドは JVM によってグローバルとして扱われ、オブジェクト インスタンスにはまったくバインドされません。ちなみに、静的メソッドのみオーバーロードできますが、オーバーライドはできません。そのため、 「ドキュメントのオーバーライドと非表示に関するOracleドキュメント」を確認してください。

スーパークラスのメソッドと同じシグネチャを持つメソッドの定義:

-----------------------------------------Superclass Instance MethodSuperclass Static Method   
Subclass Instance Method      Overrides                                     Generates a compile-time error
Subclass Static Method            Generates a compile-time error   Hides                                         

于 2013-08-04T04:13:54.537 に答える