2008/04/03

変数について~初期値って……~ [ Java ]

三日連続変数について。こりゃ書く方も読む方も
飽きるの必至だわー……といっても特に書く事も無いので昨日の続き。

さて、Javaにおいて変数が宣言された時ってその変数はどうなるんでしょうか?
まず、クラス型変数の場合

Integer height = new Integer(168);

こんな風にコンストラクタを使って初期値を設定したりします。
この場合は当たり前ですが、heightというInteger型のインスタンスが
中にint型の168という値を持ったメンバ変数を持つ……となりますね。(あってるよね?)
さて、こっからが問題なのですが

Integer height;

このように宣言のみを行った場合、この"height"という変数はどうなるのでしょうか?
昨日の日記へのコメントでmaitoさんから エラーになる! というコメントを頂きましたが
実際にはコンパイルエラー等にはなりません。

正解はnull値を持つ、です。

何度も何度も言っていますが、クラス型変数というのはオブジェクトな為インスタンス化を
行わなければいけません。その為、変数を宣言しただけではそこに値は存在しない……
つまりnullになります。

じゃあここで逆に、プリミティブ型の変数はどうなるのでしょう?
プリミティブ型の変数はオブジェクトではない為、宣言と同時に既に値は存在するはずです。
実際、下記のようなコードを書いてみれば検証はたやすいでしょう。

int height;
System.out.println(height);

上記コードを実行すると、結果は0になります。
プリミティブ型の変数は宣言と同時に初期化が行われるのです。
参考までに、プリミティブ型変数の初期値を以下に列挙しておきます。

  • byte→0
  • short→0
  • int→0
  • long→0
  • float→0
  • double→0
  • char→"\u0000"(つまり空文字、"")
  • boolean→false
こんな感じです。ほとんどゼロが入ってますね。



さて、これにてひとまずJavaにおける変数の話は終了ですかねー。
ただ自分で書いておきながらなんなんだけど、オブジェクト指向における
クラス、オブジェクト、インスタンスという概念とJavaにおける同単語の扱いが
だんだんと分からなくなってきた……
オブジェクト==インスタンス だと思っていたけどもそうでもないようで。
ここらへんは正直な所まだまだ未踏の世界なのでいずれしっかり理解
できたらここに書いていこうと思います。 何年後。

2 件のコメント:

maito さんのコメント...

>実際にはコンパイルエラー等にはなりません。

いえ、コンパイルエラーになります。
意地でもなります。

たとえJavaが正常にコンパイルできていたとしても。

同じオブジェクト内容で複数のインスタンスを生成できるという解釈はどうでしょうか?

オブジェクト<=インスタンス

ふぉー さんのコメント...

うーん。色々調べてみたけど、なんだか良く分からない感じ・・・・・・

オブジェクト<=インスタンス

この関係はオブジェクトというよりは

クラス←オブジェクト(インスタンス?)

って感じだよねー。
そもそも"Java"ではなく、"オブジェクト指向"
の世界ではインスタンスっていう概念は
無いのかもしれない……

まぁ日々勉強してるうちにいつか分かる
日が来るかも。今は寝かせておくかなぁー……