static static Fantastic! vol.4

今回も static static Fantastic! だぜ!

今回もなんだこの仕様は(゜o゜; というものが最後にあります。

間違ってるかもしれないけど興味のある方は実際に動かしてみてください。

では static メソッドのインポートについて見てみましょう。

次のコードは static メソッドをインポートして使おうとしています。

しかし、メソッド名が同じなのでコンパイルエラーになります。

jp\yucchi\static_sample_4\hoge.java
package jp.yucchi.static_sample_4;

public class hoge {

    static void calc(int i) {
        System.out.println(i + "* 2 = " + i * 2);
    }
}
jp\yucchi\static_sample_4\chage.java
package jp.yucchi.static_sample_4;

public class chage {

    static void calc(int i) {
        System.out.println(i + "* 3 = " + i * 3);
    }
}
jp\yucchi\static_sample_4\Static_sample_4.java
package jp.yucchi.static_sample_4;

import static jp.yucchi.static_sample_4.hoge.*;
import static jp.yucchi.static_sample_4.chage.*;

public class Static_sample_4 {

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

なんか前回とよく似ていますね。

ってことは・・ ワイルドカードでのインポートをやめてきっちり指定したほうのメソッドが実行されるに違いない。

Static_sample_4.java を次のように変更してみた。

package jp.yucchi.static_sample_4;

import static jp.yucchi.static_sample_4.hoge.calc;
import static jp.yucchi.static_sample_4.chage.*;

コンパイルされちゃんと実行されるようになります。

run:
100* 2 = 200
構築成功 (合計時間: 0 秒)

疑り深い私はワイルドカードのインポートを次のよう逆に入れ替えてみました。

これで実行結果が 300 となれば間違いない。

package jp.yucchi.static_sample_4;

import static jp.yucchi.static_sample_4.hoge.*;
import static jp.yucchi.static_sample_4.chage.calc;

run:
100* 3 = 300
構築成功 (合計時間: 0 秒)

間違いなかった。めでたし、めでたし、とここまでだったら前回から想像される内容だ。

では次のコードではどうだろう?(同じじゃないかよ!)

jp\yucchi\static_sample_4\hoge.java
package jp.yucchi.static_sample_4;

public class hoge {

    static void calc(int i) {
        System.out.println(i + "* 2 = " + i * 2);
    }
}
jp\yucchi\static_sample_4\chage.java
package jp.yucchi.static_sample_4;

public class chage {

    static void calc(int i) {
        System.out.println(i + "* 3 = " + i * 3);
    }
}
jp\yucchi\static_sample_4\Static_sample_4.java
package jp.yucchi.static_sample_4;

import static jp.yucchi.static_sample_4.hoge.*;
import static jp.yucchi.static_sample_4.chage.*;

public class Static_sample_4 {

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

コンパイルエラー!

calc() メソッドがどちらを使えばいいのか解らないからですよね。

先述のようにインポート文を変更すれば解決できるのですが今回はちょっと違ったみかたをします。

calc() メソッドの引数を変更してみます。

メソッドオーバーロードで解決できるか試してみます。

次のようにコードを変更します。

jp\yucchi\static_sample_4\chage.java
package jp.yucchi.static_sample_4;

public class chage {

    static void calc(long i) {
        System.out.println(i + "* 3 = " + i * 3);
    }
}

このように chage クラスの calc() めそっどの引数を long に変更してみました。

main() メソッドから呼ばれる calc() メソッドの引数は int なのでこれでいけるはず。

さて、どうでしょう?

run:
100* 2 = 200
構築成功 (合計時間: 1 秒)

コンパイルも実行も問題ないですね(^^)

疑り深い私は次のように calc() メソッドの呼び出しを long でやってみました。

コンパイル、実行がちゃんとできるでしょうか?

public static void main(String[] args) {
    calc(100L);
}

run:
100* 3 = 300
構築成功 (合計時間: 0 秒)

問題ないですね。ばっちりOKです。

では、最後に面白いコードを(^^)

ゆっくり画面をスクロールさせてどうなるか考えてみてください。

このプログラムの動作が理解できたらあなたは static import を良く理解できているでしょう。

 

jp\yucchi\static_sample_4\hoge.java
package jp.yucchi.static_sample_4;

public class hoge {

    static int VAL = 10000;

    static void calc(int i) {
        System.out.println(VAL + "* 2 = " + VAL * 2);
    }
}
jp\yucchi\static_sample_4\chage.java
package jp.yucchi.static_sample_4;

public class chage {

    static int VAL = 1;

    static void calc(int i) {
        System.out.println(VAL + "* 2 = " + VAL * 2);
    }
}
jp\yucchi\static_sample_4\Static_sample_4.java
package jp.yucchi.static_sample_4;

import static jp.yucchi.static_sample_4.hoge.*;
import static jp.yucchi.static_sample_4.chage.VAL;

public class Static_sample_4 {

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

run:
10000* 2 = 20000
構築成功 (合計時間: 0 秒)

コンパイルも実行もされます。

calc() メソッドの引数は int で同じなのにね(゜o゜;

でも、実行結果が・・・

chage クラスの VAL が優先されるから実行結果は 2 となると思っていた。

static import 奥が深いぜ!

誰か詳しく優しく説明しておくれ~

Hatena タグ:

 

static static Fantastic! vol.3

今回も static static Fantastic だぜ!

前回、 static import の使い方を覚えた。

しかし、次のようなコードだとコンパイルエラーになる。

jp\yucchi\static_sample_3\Kyouko.java
package jp.yucchi.static_sample_3;

/**
 *
 * @author Yucchi
 */
public class Kyouko {

    public static int BUST = 86;
    public static int WAIST = 62;
    public static int HIP = 88;
}

jp\yucchi\static_sample_3\Meisa.java
package jp.yucchi.static_sample_3;

/**
 *
 * @author Yucchi
 */
public class Meisa {

    public static int BUST = 80;
    public static int WAIST = 60;
    public static int HIP = 85;
}

jp\yucchi\static_sample_3\Static_sample_3.java
package jp.yucchi.static_sample_3;

import static jp.yucchi.static_sample_3.Kyouko.*;
import static jp.yucchi.static_sample_3.Meisa.*;

/**
 *
 * @author Yucchi
 */
public class Static_sample_3 {

    public static void main(String[] args) {
        System.out.println("Kyouko のバストは " + BUST + "センチです。");
    }
}

 
BUST が Kyouko.BUST か Meisa.BUST か解らないからだろう。
しかし、import 文のワイルドカード(スターインポート)を Kyouko クラスだけ変更してみる。
 

package jp.yucchi.static_sample_3;

import static jp.yucchi.static_sample_3.Kyouko.BUST;
import static jp.yucchi.static_sample_3.Meisa.*;

上記のように変更してもコンパイルエラーになると思っているあなた!なんと、コンパイルされてしかもちゃんと実行されます。(゜o゜;

run:
Kyouko のバストは 86センチです。
構築成功 (合計時間: 0 秒)

なんか不思議だ。

どうしてこんな仕様になったのか猿でも解る説明を誰かしておくれ。

Hatena タグ: