static static Fantastic! vol.4
今回も static static Fantastic! だぜ!
今回もなんだこの仕様は(゜o゜; というものが最後にあります。
間違ってるかもしれないけど興味のある方は実際に動かしてみてください。
では static メソッドのインポートについて見てみましょう。
次のコードは static メソッドをインポートして使おうとしています。
しかし、メソッド名が同じなのでコンパイルエラーになります。
jp\yucchi\static_sample_4\hoge.java |
1 2 3 4 5 6 7 8 |
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 |
1 2 3 4 5 6 7 8 |
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 |
1 2 3 4 5 6 7 8 9 10 11 |
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 を次のように変更してみた。
1 2 3 4 |
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 となれば間違いない。
1 2 3 4 |
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 |
1 2 3 4 5 6 7 8 |
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 |
1 2 3 4 5 6 7 8 |
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 |
1 2 3 4 5 6 7 8 9 10 11 |
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 |
1 2 3 4 5 6 7 8 |
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 でやってみました。
コンパイル、実行がちゃんとできるでしょうか?
1 2 3 |
public static void main(String[] args) { calc(100L); } |
run:
100* 3 = 300
構築成功 (合計時間: 0 秒)
問題ないですね。ばっちりOKです。
では、最後に面白いコードを(^^)
ゆっくり画面をスクロールさせてどうなるか考えてみてください。
このプログラムの動作が理解できたらあなたは static import を良く理解できているでしょう。
jp\yucchi\static_sample_4\hoge.java |
1 2 3 4 5 6 7 8 9 10 |
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 |
1 2 3 4 5 6 7 8 9 10 |
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 |
1 2 3 4 5 6 7 8 9 10 11 |
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 奥が深いぜ!
誰か詳しく優しく説明しておくれ~
TAGS: Java | 2012年5月18日7:53 AM
Comment-
Yucchisays:
2012年5月18日 11:39 AM
誰も釣られてくれないから答えを投稿しました。
Trackback URL