static static Fantastic! vol.5

Java

今朝投稿した記事だけど誰も釣られてくれないからプログラムを少し変更してみた。

jp\yucchi\static_sample_4\hoge.java

jp\yucchi\static_sample_4\chage.java

jp\yucchi\static_sample_4\Static_sample_4.java

VAL の値を標準出力させてみました。

run:
main() atart VAL = 1
CALL hoge
VAL = 10000
10000* 2 = 20000
main() end VAL = 1
構築成功 (合計時間: 0 秒)

hoge クラスの calc() メソッドが呼ばれてます。

main() メソッドの中にある calc() メソッドの引数の値は1のようです。

そして、calc(VAL) メソッドでよばれるのが hoge クラスなのは何故?

その答えは単純です。

static import 文をよく見てください。

chage クラスは static 変数である VAL だけをインポートしています。

よって、chage クラスの calc(VAL) メソッドは呼ばれることは無いんです。

hoge クラスの calc(VAL) が呼ばれて hoge クラスの VAL の値で計算されてしまいます。

なかなか面白いことになってますね。

引数の値よりクラスの static 変数が優先されてしまう。

chage クラスの calc(VAL) メソッドを実行させたかったら

次のようにインポート文を変更したらいい。

っていうか・・・ hoge クラス使わなきゃいいじゃん(^_^;)

Hatena タグ:

static static Fantastic! vol.4

Java

今回も static static Fantastic! だぜ!

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

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

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

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

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

jp\yucchi\static_sample_4\hoge.java

jp\yucchi\static_sample_4\chage.java

jp\yucchi\static_sample_4\Static_sample_4.java

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

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

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

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

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

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

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

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

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

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

jp\yucchi\static_sample_4\hoge.java

jp\yucchi\static_sample_4\chage.java

jp\yucchi\static_sample_4\Static_sample_4.java

コンパイルエラー!

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

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

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

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

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

jp\yucchi\static_sample_4\chage.java

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

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

さて、どうでしょう?

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

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

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

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

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

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

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

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

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

 

jp\yucchi\static_sample_4\hoge.java

jp\yucchi\static_sample_4\chage.java

jp\yucchi\static_sample_4\Static_sample_4.java

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

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

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

でも、実行結果が・・・

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

static import 奥が深いぜ!

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

Hatena タグ: