0

静的メソッドのオーバーライドの場合..以下のコードを開発しました

class Ab {  
    static void getF() {
        System.out.println("I am saral");
    }
}

class Ham extends Ab {
    static void getF() {
        System.out.println("I am saral saxena");
    }
    public static void main(String[] args) {
        // Ham h = new Ham();
        // h.getF(); //Ham
        Ab a = new Ham();
        a.getF(); // Ab class
    }
}

今私の質問は、私がポリモーフィック動作を使用しているときに静的メソッドをオーバーライドする場合、Ab a = new Ham();この段階ではまだgetF();class のメソッドを取得していることですAb。アドバイスしてください。

4

4 に答える 4

5

静的メソッドをオーバーライドすることはできません。

静的メソッドはクラスに属します。Ab.getF()またはを呼び出すことができますHam.getF()-コーディング時にどちらを選択しましたか。

クラス階層で静的メソッドに同じ名前を付けても、まったく影響はありません (プログラマーが混乱する可能性があることを除けば)。静的メソッドは、インスタンスではなくクラスに属するコードのフローティング ビットです。インスタンス メソッドのみがオーバーライドの影響を受けます。

このため、メソッドがインスタンス メソッドのように見えるため、(あなたが持っているように) インスタンスで静的メソッドを呼び出すのは不適切なスタイルです。言語では許可されていますが、特に静的メソッドがインスタンス メソッドのような名前を持っている場合は、プログラマーの混乱を招き、バグが発生しますsetName(String)

于 2012-05-05T11:35:50.647 に答える
4

コンパイル時に、インスタンスによって呼び出される静的メソッドは、実際にインスタンス化されたクラスではなく、変数が宣言されたクラスで呼び出されるようにコンパイルされるため、a.getF();結果は isAb.getF();および notになりHam.getF();ます。

一般に、クラス名の代わりにインスタンスを使用して静的メソッドを呼び出すことは、非常に悪い習慣です。Thread.sleep()(最良の例は、インスタンスでの呼び出しだと思いますthread。インスタンススレッドがスリープ状態になると仮定しますが、実際には現在のスレッドがスリープ状態になります)

于 2012-05-05T11:35:17.450 に答える
0

まず、派生クラスの名前とシグネチャを持つ静的メソッドが基本クラスと同じである状況をオーバーライドの場合と呼ぶことはできません。

これは、オーバーライドの場合、コンパイラは関数呼び出しのバイト コードを生成しないためです。実際にどのメソッドが呼び出されるかは、参照変数のポリモーフィックな動作に応じて実行時に解決されます。

オーバーライドは、実際にはコンパイラのそのような動的な動作によって定義されます (同じ署名付きメソッドを持つ基本クラスとサブクラスによってではなく、これらはオーバーライドの前提条件にすぎません)。

静的メソッドはクラス エンティティであるため、ランタイム オブジェクトではなく参照変数にバインドされるため、メソッド呼び出しはコンパイル時にのみ解決されます (参照変数の型、または参照されている場合はクラス名に基づいて)。

同様に、スーパークラスとサブクラスの両方に同じ名前と型を持つパブリックインスタンス変数または静的変数がある場合、実行時オブジェクトの代わりに変数の型を持つものが選択されます。

于 2012-09-07T13:31:56.697 に答える
0

静的関数をオーバーライドすることは不可能であり、役に立ちません (メソッドはオブジェクトに関連するため、メソッドという用語は避けています)。

オブジェクトのクラスに応じて異なる静的関数を呼び出す必要がある場合は、このようにします

class Ab {  
 private static void getF() {
    System.out.println("I am saral");
 }
 public void doit () {
   getF ();
 }
}
class Ham extends Ab {
 private static void getF() {
    System.out.println("I am saral saxena");
 }
 @Override
 public void doit ()
 {
    getF ();
 }
 public static void main(String[] args) {
    Ab a = new Ham();
    a.doit(); // Ham class
}

}

ところで、関数 return voidに getを使うのはおかしい

于 2012-05-05T11:45:21.290 に答える