makoto_blog

パパさん_blog

プログラミング勉強メモや雑記など。

Java staticインポート

static インポート

インポートしたクラスにインポートされたメソッドやフィールドと同名のものがあった場合、そのインポートは無視される。
だけどもだっけっど、
インポートしたクラスにインポートされたメソッドやフィールドと同名のものがなく、更に同じ名前で2つインポートしたらコンパイルエラーになる。

試してみる

staticインポートし、同名のフィールドがある場合、インポートは無視される

Testクラス(VALUEは50)

package ex;

public class Test {
    public final static int VALUE = 50;
}

Mainクラス
Testをimportしてるけど、Mainクラス内でVALUE宣言。

package ex;
import static ex.Test.VALUE;

public class Main {
    private final static int VALUE = 0;
    public static void main(String[] args) {
        System.out.println(VALUE);
        }
}

実行してみましょう。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. Main.java
mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ java -cp .. ex.Main
0

import、めっちゃ無視されてるw

もひとつstaticインポートするとどうなる?

こんなクラスを追加

package ex;

public class Sample7 {
    public final static int VALUE = 100;
}

Mainクラスも修正

package ex;
import static ex.Sample7.VALUE; // ここ
import static ex.Test.VALUE;

public class Main {
    private final static int VALUE = 0;
    public static void main(String[] args) {
        System.out.println(VALUE);
        }
}

どうなるか。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. Main.java
mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ java -cp .. ex.Main
0

コンパイルエラーにならんのかい!
ならんのですね。

メインクラスでの宣言やめたらどうなる?

package ex;
import static ex.Sample7.VALUE;
import static ex.Test.VALUE;

public class Main {
    // private final static int VALUE = 0;
    public static void main(String[] args) {
        System.out.println(VALUE);
        }
}

コンパイルすると、、

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. Main.java
Main.java:8: エラー: VALUEの参照はあいまいです
        System.out.println(VALUE);
                           ^
  Sample7の変数 VALUEとTestの変数 VALUEの両方が一致します
エラー1個

怒られてるw

そりゃどっちかわからんわw だけどMainクラスに宣言してればそれ使えばいいからOKなのか。なんかimport文きれいにしときたい感じするけどね。

普通にstaticインポートした方を出すには

素直な感じに。

package ex;
// import static ex.Sample7.VALUE;
import static ex.Test.VALUE;

public class Main {
    // private final static int VALUE = 0;
    public static void main(String[] args) {
        System.out.println(VALUE);
        }
}

予想通りだね。

mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ javac -cp .. Main.java
mhaya@mhaya-V5-131:~/work/java_sandbox/ex$ java -cp .. ex.Main
50

これでだいたい、関係性がわかりましたね。
JavaSilverの試験勉強1問ごとにこんな事やってたら終わらんね。
でも試してみないと全然おもろくないよね。暗記だけだとね。