2

私が持っているのは、このようになる2つのクラスです。

public class Class1 {

    public static void staticMethod1(){}

    public static void staticMethod2(){}

    public static void commonStaticMethod(){}

}

そしてクラス2として

import static Class1.*;

public class Class2 {

    public static void commonStaticMethod(){}

}

そして驚いたことに、これはエラーや警告さえもなしにコンパイルされました。では、静的インポートはどのようにオーバーロードから逃れるのでしょうか?

4

5 に答える 5

3

静的インポートは過負荷ではありません。これらは、他のクラスの静的メソッドの使用を短くするための単なる構文糖衣です。

つまり、現在のコンテキストで使用できないメソッドが呼び出されると、静的インポートをチェックして、一致する静的メソッドがあるかどうかを確認します。

したがって、次staticMethod()のように展開しますSomeOtherClass.staticMethod()

特定のケースでは、 を呼び出そうとしないため、競合はありませんcommonStaticMethod。そうすれば、コンパイラはあいまいさを訴えるか、現在のクラスの静的メソッドにデフォルト設定されます (どちらかはわかりません-静的インポートでは * を使用しません)。しかし、これは自分で簡単に確認できるものです。

于 2012-09-20T10:27:28.233 に答える
1

静的インポートの機能について混乱しています。B. *のクラスAの静的インポートでは、静的メソッド呼び出しの前に追加せずに、AのコードでBの静的メソッドのみを呼び出すことができB.ます。オーバーライドとは関係がなく、BからクラスAにメソッドを追加しません。

于 2012-09-20T10:29:01.493 に答える
0

commonStaticMethodClass2でClass1のを非表示にしました。

同じメソッドを持つ2つのクラスの静的インポートを実行し、そのメソッドをクラスで使用しようとすると、予期したエラーが発生します。

于 2012-09-20T10:28:15.650 に答える
0

Class2を拡張しないため、オーバーロードはありませんClass1Class2インポートされたものと同じメソッド名を持っているので、このメソッド名への修飾されていない参照はローカルインスタンスを想定するという隠蔽があります。インポートされたものを使用するには、メソッドを次のように修飾する必要がありますClass1.commonStaticMethod

于 2012-09-20T10:29:16.770 に答える
0

あなたがここで何を期待しているのか理解できません。囲んでいるスコープまたは別のスコープからの名前をいつでもオーバーライドできます。それは、import他のスコープを開くことだけです。

于 2012-09-20T10:25:14.760 に答える