2011年8月30日火曜日

・変数について。

とりあえず、しょっぱなです。
が、Androidって言うよりかはJava系で学んだことを。

変数についての自分の理解が欠けていました。
例えば

String str = "abc";

って書いてあれば、何の根拠もなく
strの中には"abc"と言う文字列があるんだな、と思っていました。
でも、実際にstrが持っているのは参照情報。
C言語で言うポインタです。
この場合、strはメモリ上に"abc"と言う文字列情報が無いかを
探し出し、発見した場合、その文字列のあるアドレスを取得します。

str = 番地  →  "abc"
                    参照

String型は特別なんですが、もしも"abc"の文字列情報が無い場合は
新しく生成し、それとリンクさせます。

だから、もしも

String str1 = "abc";
String str2 = "abc";

とすると、二つの変数が指し示す参照先は全く同じになるので、
片方を書きかえると、もう片方も自動的に書き変わってしまいます。

str1 = str1 + "def";

str1 → "abcdef"
str2 → "abcdef"

これら二つの参照先は同じなので,比較の時は"=="を使う事が出来ますが、
一般的にはオブジェクト比較のequals()を使いますよね。
"=="はほとんど使う機会が無いと思います。


さて、そこで次のお話。
インスタンス生成っていつ行われるんでしょう??
それが気になってこの件について調べ始めたのですが、
インスタンスの生成と言えば、newを使ってコンストラクタを
呼びだすことが一般的です。

String str = new String("abc");

じゃあ

String str1 = "abc";
String str2 = str1.substring(0,1);

とかってどうなってるんでしょう??
newしてないぞ?いつインスタンスが生成されているんだ!
と思ったんです。

あまりに訳がわからなかったので、そもそもインスタンスの生成
って何よ!って調べてみたら、メモリ上にデータが作られた時の事
を言うようです。どうやら。

つまり、上の例のstr1の場合だと、"abc"が最後に作られた時が
インスタンスの生成のタイミングですし、後者のメソッドの戻り値を
利用したパターンでは、戻り値を生成した時がインスタンスの生成の
タイミングになるのではないか、と。

だとすれば、変数を宣言した時にインスタンスが生成されるとは限らない!
と言う事になります。
でも、この考え方だと、どうにも一般的なJavaのサイトとは意見が合いにくい。
一般的には、"インスタンスを最初に変数に代入したとき"がインスタンス生成の
タイミングになっているような気がします。
だとすれば全部納得!
今んとこ、自分の中でそう思っています。


とりあえず、今日はこんな感じでした^^

・初回サンプル

初回のサンプル。
どんなもんかいね??

社会人やってます、しゃるはたです。
Androidについて結構勉強中。
と言っても、まだまだ無知!
ブログやってはる先輩方を見習ってやってみました!

やるだけでレベルアップするとは思わないけども
頑張って同じレベルで話せる努力します。