
ポイントというか心にとまったことのアウトプットです。
※手を動かして理解したことなど、間違いを含む可能性があります。
※手元の環境は断りがなければ基本はjava 7 をIntelliJ IDEA Ultimate on OSX で動かしてます。
変数とオブジェクト
- 基本型 = プリミティブ型 = 値型
- 参照型変数は、代入(=)により参照場所が登録される
Integer i2 = 1;
Integer i3 = i2;
i2 = 3;
System.out.println(i2); //3
System.out.println(i3); //1 //3じゃない
Integer i4 = 4;
Integer i5 = i4;
i4 ++; //内部的には再代入。(+= 1 と同義か)
System.out.println(i4); //5
System.out.println(i5); //4
StringBuilder sb3 = new StringBuilder("test");
StringBuilder sb4 = sb3;
sb3.append("add");
System.out.println(sb3); //testadd
System.out.println(sb4); //testadd
String s7 = "str";
String s8 = s7;
s7 = "edit";
System.out.println(s7); //edit
System.out.println(s8); //str
- 変数に代入(=)を行うと、その変数の参照が違うところへ向くことがわかる。(←IntelliJでデバッグするとよりわかりやすい。代入の前後で変数が持っている参照の向き先のオブジェクトID(変数の型のあとに、@~~のところの数字)が変わります。)
- Oracle推奨のコーディングスタイル 日本語訳
基本型変数が保持しているのは参照ではなく値。代入時には値がコピーされる
Objects.nonNull()
Objects.isNull()
はjava 8じゃないと使えない ココも参照初期化してないフィールド変数は、Objects.isNull()にかけると
true
が返ってくる。 ← フィールド変数で参照型の場合は、初期化をしないとデフォルト初期値がnull。ローカル変数にはデフォルト初期値は不定。ローカル変数を未初期化で使おうとするとコンパイルエラーOptional (java8) ScalaのOptionと同じと思っておk?
Optional のorElse(), orElseGet(), ifPresent(), map() を使いこなせるように
ローカル変数、パラメータ変数(引数)はメソッドが終わると消滅
シャドーイング(親スコープで宣言されているものを、自スコープで宣言)は禁止(フィールド変数とローカル変数の関係はまた別)
同名のフィールド変数とローカル変数があったら、ローカル変数が優先(名前同じはエラーではない)
以下、変数の参照の理解の確認
~~
StringBuilder sb10 = new StringBuilder("test");
appendSb(sb10);
System.out.println(sb10); //testappend
String s10 = "test";
appendString(s10);
System.out.println(s10); //test
}
public static void appendSb(StringBuilder s) {
s.append("append");
}
public static void appendString(String s) {
//まだこの時点では、パラメータ変数sと、呼び出しもとの変数s10は同じ参照を持っている
s += "append"; //ここで新しいオブジェクトが作られ、パラメータ変数sにその新しいオブジェクトの参照が代入される
}
- 推奨:フィールド変数にはfinalつける(つけない場合は変更する意志があるとみなす)
疑問
- flatMap() ← 8章読む
- メソッドチェインは変数代入に比べて効率が良い?
- ブロックスコープの使いどころは?