3

I know it is a pretty beaten topic here but there is something i need to clarify, so bear with me for a minute.

Static methods are inherited just as any other method and follow the same inheritance rules about access modifiers (private methods are not inherited etc.)

Static methods are not over-ridden they are redefined. If a subclass defines a static method with the same signature as one in the superclass, it is said to be shadowing or hiding the superclass's version not over-riding it since they are not polymorphic as instance methods.

The redefined static methods still seem to be following some of (if not all) of the over-riding rules.

Firstly, the re-defined static method cannot be more access restricted than the superclass's static method. Why??

Secondly, the return types must also be compatible in both the superclass's and subclass's method. For example:

class Test2 {
    static void show() {
        System.out.println("Test2 static show");
    }
}

public class StaticTest extends Test2 {
    static StaticTest show() {
        System.out.println("StaticTest static show");
        return new StaticTest();
    }

    public static void main(String[] args) {
    }

}

In eclipse it shows an error at line at: The return type is incompatible with Test2.show() Why??

And Thirdly, are there any other rules that are followed in re-defining static methods which are same as the rules for over-riding, and what is the reason for those rules?

Thanx in advance!!

4

1 に答える 1

7

静的メソッドを非表示にするための要件は、Java 言語仕様の §8.4.8.3で詳しく説明されています。概して、インスタンス メソッドと同じです。

  1. (サブクラスの) 非表示メソッドの戻り値の型は、(スーパークラスの) 非表示メソッドの戻り値の型と代入互換でなければなりません。
  2. 非表示メソッドのアクセス修飾子は、非表示メソッドのアクセス修飾子より制限的であってはなりません。
  3. 消去前のシグネチャが method のサブシグネチャでない限り、mクラス 内のメソッドが でアクセス可能な別のメソッドと消去後Tに同じシグネチャを持つことはエラーです。nTm n
  4. throwsチェック例外をスローするように宣言されている他のメソッドを非表示、オーバーライド、または実装するメソッドの句には制限があります。(基本的に、非表示/オーバーライド/実装メソッドで宣言されていないチェック済み例外をスローするように非表示メソッドを宣言することはできません。)

それだけだと思いますが、詳細については JLS を参照してください。JLS はこれらの規則の根拠を説明していませんが、それらのほとんどはポリモーフィズムの問題を防ぐことを意図しているようです。親クラスが使用されている場合は、サブクラスを使用できるようにする必要があります。

于 2012-08-05T08:04:52.430 に答える