パーフェクトJava読書メモ chapter 4 変数とオブジェクト
Javaを使うために改訂2版 パーフェクトJavaを読んだメモ
変数とオブジェクト
- Javaの変数は以下の二つに分類される
- オブジェクトはある体系にそってデータを表すモノであり、名前を持たない
変数
参照型変数
- C言語のポインタ型変数の値がメモリ上のアドレス値そのものであるのに対し、Javaの参照型変数の値はオブジェクトの位置情報を指し示す抽象的な「何か」である
- 参照型変数は名前を持ち、オブジェクトを参照することで扱いやすく橋渡しする
- 参照型変数自体に型があり以下の3種類、これは参照しているオブジェクトの型とは別
基本型変数
- 基本型変数は値をそのまま保持する
- 基本型の種類は以下の8つ
boolean
byte
char
short
int
long
float
double
変数の宣言
- 変数を使うには最初に変数を宣言する
- 変数宣言は最初に変数の型を書き、続けて変数名を書く
StringBuilder sb;
int i;
void method(int i) {
int i;
}
// コンパイルエラー
変数の初期化
int i = 1;
- 初期化しない場合の変数のデフォルト値は変数の型と種類に依存する
変数の修飾子
- 変数の宣言時に修飾子を付けることができる
- 変数に使える修飾子は以下
private
protected
public
transient
final
static
volatile
オブジェクト
オブジェクトの生成
new
の後にクラス名を書き、 ()
で引数を指定する
- 引数の定義はクラスごとに決まっている
new StringBuilder("012");
参照型変数への代入
- 生成したオブジェクトは参照型変数へ参照を渡して扱う
StringBuilder sb = new StringBuilder();
- あくまで変数が扱っているのはオブジェクトへの参照なので、以下の例では2つの変数は同じオブジェクトへの参照を持つ
StringBuilder sb = new StringBuilder();
StringBuilder sb2 = sb;
sb.append("012");
sb2.append("345");
// sb: "0123445"
// sb2: "012345"
基本型変数への代入
- 基本型変数へ代入されるのはオブジェクトの参照ではなく値そのもの
- 値そのものをコピーして代入する
int i = 42;
int j = i + 1;
int K = i;
// i: 42
// j: 43
// k: 42
null参照
null
は「何も参照していない」ということを表す
StringBuilder sb = null;
nullチェック
- 参照先がなく、
null
を持つ参照型変数にたいする演算は NullPointerException
Object
クラスに null
をチェックするためのメソッドがある
method |
description |
equals |
引数のどちらかが null でも使える比較 |
toString |
null の場合の文字列を指定可能 |
isNull |
引数が null のとき真 |
notNull |
引数が null でないとき真 |
requireNonNull |
引数が null だと即座に NullPointerException |
Optional型
Optional
型は任意のオブジェクトをくるんで null
かもしれない状態を表現する
- 基本型変数のための
Optional
型として以下の 3 つがある
OptionalInt
OptionalLong
OptionalDouble
Optional
オブジェクトは of
または ofNullable
メソッドを使って任意のオブジェクトから生成できる
StringBuilder sb;
Optional<StringBuilder> osb = Optional.of(sb);
// or
// Oprional<StringBuilder> osb = Optional.ofNullable(sb);
get
メソッドで Optional
オブジェクトでくるんだオブジェクトを取得
Optional<StringBuilder> osb;
StringBuilder sb = osb.get();
- くるんだオブジェクトが
null
でなければそのまま呼び出し、 null
であれば引数のオブジェクトを返す例
StringBuilder sb = osb.orElse(new StringBuilder("none"));
変数を介さないオブジェクトの操作
- 変数に参照を格納しなくてもオブジェクトを操作できる
int len = new StringBuilder("012").length();
int len = "abc".length();
- ドット演算子でメソッド呼び出しをつなげることをメソッドチェインという
StringBuilder sb = new StringBuilder();
int len = sb.append("012").append("345").length();
// len: 6
変数と型
- オブジェクトの型はクラスで定義されている
- 変数の型とオブジェクトの型が一致もしくはオブジェクトの型が変数の型の下位型であるとき変数にオブジェクトの参照を代入可能
- 変数が参照するオブジェクトに対して行える操作は変数の型できまる
- 下位型のオブジェクトは上位型の持つメソッドを持つことが保証されている
変数の詳細
変数の種類
type |
description |
ローカル変数 |
メソッドもしくはコンストラクタ内で宣言される。メソッドやコンストラクタが終わると消滅。 |
パラメータ変数 |
メソッドもしくはコンストラクタに引数として渡る。メソッドやコンストラクタが終わると消滅。 |
インスタンスフィールド変数 |
クラスの構成要素 |
クラスフィールド変数 |
クラスの構成要素 |
変数のデフォルト値
type |
default value |
参照型 |
null |
boolean |
false |
char |
"¥u0000" |
byte , short , int , Long |
0 |
float , double |
+0.0 |
変数のスコープ
ローカル変数
- 変数を宣言した行からメソッドもしくはコンストラクタが終わるまで
ブロックスコープ
{}
で囲ったブロックに閉じたスコープ
- 変数を宣言した行からブロックが終わるまで
シャドーイング
パラメータ変数のスコープ
フィールド変数のスコープ
- フィールド変数のスコープはクラス内
- 宣言した行の位置は無関係
オブジェクトの寿命
オブジェクトへの参照が外れる条件
* ローカル変数及びパラメータ変数のスコープが外れたとき
* オブジェクトが消滅したとき
* クラスが消滅し、クラスフィールド変数の参照が外れたとき
* 変数に別のオブジェクトの参照もしくは null
が再代入されたとき
* 変数を介さない操作がされていた場合、式の評価が終わったとき
final変数と不変オブジェクト
final
修飾子を指定した変数を final 変数と呼ぶ
- final 変数は再代入不可
final
修飾子が禁止するのは変数自体の値の変更であって、変数が参照するオブジェクト自体の変更ではない
参照
改訂2版 パーフェクトJava