34

Java で静的メソッドをオーバーライドできないことはわかっていますが、次のコードを説明できる人はいますか?

class A {
    public static void a() { 
        System.out.println("A.a()");
    }
}   

class B extends A {
    public static void a() {
        System.out.println("B.a()");
    }
}

a()クラスでメソッドをオーバーライドするにはどうすればよいBですか?

4

9 に答える 9

54

ここでは何もオーバーライドしませんでした。自分で確認するには、クラスの@Override前に注釈を入れてみてください。Java はエラーをスローします。public static void a()B

Bというクラスの関数を定義したところです。これは、クラスの関数a()とは異なります (まったく関係がありません) 。a()A

しかしB.a()、親クラスの関数と同じ名前を持っているため、 [Eng が指摘したように非表示にします。 A.a()フード]。実行時に、コンパイラは宣言された参照の実際のクラスを使用して、実行するメソッドを決定します。例えば、

B b = new B();
b.a() //prints B.a()

A a = (A)b;
a.a() //print A.a(). Uses the declared reference's class to find the method.

Java では静的メソッドをオーバーライドできません。メソッドstaticとフィールドは、オブジェクトではなくクラスに関連付けられていることに注意してください。(ただし、Smalltalk などの一部の言語では、これが可能です)。

私はここでいくつかの良い答えを見つけました:なぜ Java は静的メソッドのオーバーライドを許可しないのですか?

于 2013-05-17T20:33:52.747 に答える
9

hiding a methodJava チュートリアルOverriding and Hiding Methodsに記載されているように、これは と呼ばれます。

サブクラスがスーパークラスのクラス メソッドと同じシグネチャを持つクラス メソッドを定義する場合、サブクラスのメソッドはスーパークラスのメソッドを隠します。

于 2013-05-17T20:35:46.287 に答える
6

staticメソッドは継承されないため、Bメソッドの別のコピーです

staticclassの状態ではなく関連しているObject

于 2013-05-17T20:32:33.457 に答える
3

メソッドは継承されないa()ため、メソッドをオーバーライドしませんでした。staticを入力した場合@Override、エラーが表示されます。

A.java:10: error: method does not override or implement a method from a supertype
    @Override
    ^
1 error

しかし、それは両方のクラスで同じシグネチャを持つ静的メソッドを定義することを止めるものではありません。

于 2013-05-17T20:33:14.093 に答える
2

また、呼び出すメソッドの選択は、宣言された変数の型によって異なります。

B b = null;
b.a(); // (1) prints B.a()
A a = new B();
a.a(); // (2) prints a.a() 

(1) で、システムが の ID を気にする場合、bをスローしNPEます。(2) では、 の値aは無視されます。aは として宣言されているため、AA.a()呼び出されます。

于 2013-05-17T20:38:58.540 に答える
1

あなたのメソッドはオーバーライドされたメソッドではありません。派生クラスのメソッドの前に @Override アノテーションを付けようとするだけです。コンパイル時エラーが発生します。そのため、Java では静的メソッドをオーバーライドできません。

于 2014-05-23T04:17:08.927 に答える
1

goblinjuice の回答は受け入れられましたが、サンプル コードを改善できると思いました。

public class StaticTest {
    public static void main(String[] args) {
        A.print();
        B.print();
        System.out.println("-");

        A a = new A();
        B b = new B();
        a.print();
        b.print();
        System.out.println("-");

        A c = b;
        c.print();
    }
}

class A {
    public static void print() {
        System.out.println("A");
    }
}

class B extends A {
    public static void print() {
        System.out.println("B");
    }
}

プロデュース:

A
B
-
A
B
-
A

B がオーバーライドされていた場合print()、最終行に B を書き込みます。

于 2016-09-27T12:50:53.373 に答える
0

静的メソッドはそのクラス名で呼び出されるため、クラス オブジェクトを作成する必要はありません。クラス名で呼び出すだけなので、静的をオーバーライドすることはできません。

例えば

class AClass{
public static void test(){

 } 
}

class BClass extends AClass{
public static void test(){}

}

class CClass extends BClass{
public static void main(String args[]){

AClass aclass=new AClass();

aclass.test(); // its wrong because static method is called 
               // by its class name it can't accept object
}
}

私たちはそれを呼ぶだけです

AClass.test();

オーバーライドされている場合、静的クラスをオーバーライドできないことを意味し、それを呼び出す方法。

于 2015-03-04T16:54:17.150 に答える