このエントリーをはてなブックマークに追加

ポイントというか心にとまったことのアウトプットです。

※手を動かして理解したことなど、間違いを含む可能性があります。

※手元の環境は断りがなければ基本は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(変数の型のあとに、@~~のところの数字)が変わります。)

f:id:takudo_dev:20150214145047j:plain

  • Oracle推奨のコーディングスタイル 日本語訳
  • Google推奨のコーディングスタイル 英語

  • 基本型変数が保持しているのは参照ではなく値。代入時には値がコピーされる

  • 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章読む
  • メソッドチェインは変数代入に比べて効率が良い?
  • ブロックスコープの使いどころは?

参考

Javaオブジェクトクラスメモ(Hishidama's Java Object Memo)