スッキリわかるJava 第9章 【様々なクラス機構】
・インスタンスの実体はコンピュータのメモリ領域である。
・インスタンスも配列の時と同様にメモリのアドレスが保管されるのみで参照型の変数となる。
・同じクラスから生まれた異なるインスタンスはお互いに影響を与えることはない。これをインスタンスの独立性と呼ぶ。
・newの数とインスタンスの数は同じ。
メンバ変数の取り扱いには十分に注意する。
・あるクラスが別のクラスをフィールドとして利用している関係をhas-aの関係と呼ぶ。
・String型はクラス型である。java.langパッケージ内で宣言されているクラスを使っているだけ。本来はnew演算子が必要だが、多用されるため特例として””で囲むとStringインスタンスを利用できるというルールになっている。
・コンストラクタ通常のメソッドは「誰かから呼ばれないと動かないもの」だが、newされた直後に自動的に実行するメソッドをコンストラクタと呼ぶ。コンストラクタはプログラマ自身が直接呼び出すものではない。間接的に実行される処理である。
定義方法:
①メソッド名がクラス名と完全に等しい。
②メソッド宣言に戻り値が宣言されていない(voidも不可)。コンストラクタに情報を渡すと毎回異なった値を受け取ることができるようになる。
コンストラクタに引数を渡す場合newする際に()内に引数を記述することで実現できる。
・受け取る値を引数で指定したい場合、引数を指定しない場合を定義することができる。
Hero(String name){...};
Hero(){...};
・Javaは全てのクラスのインスタンス化の際に、必ずなんらかのコンストラクタを実行するようになっている。それぞれのクラスは必ず一つ以上のコンストラクタを持っている必要がある。ただし、毎回必ずコンストラクタを定義するのは不便な為、コンストラクタの定義がない場合、自動的に引数も処理もないデフォルトコンストラクタが生成されるという特例がある。
・これまでのインスタンス化では自動的にデフォルトコンストラクタが呼ばれていた。しかし、コンストラクタがプログラマの手によって定義されると、特例が適用されずnew hoge();のような記述でインスタンス化することができない。
・重複を避けるためにコンストラクタの中で、別のコンストラクタを呼び出す場合、this.クラス名(引数); ではなくthis(引数);と記述することで特例で呼び出しを行うことができる。(このthisは今までのthisとは関連づけない。あくまでコンストラクタの呼び出しに関するルールであると抑える。)
・静的メンバstatic 型 変数名;のように表す。
・staticキーワードを指定したフィールドは特に静的フィールド(static field)と呼ばれ、3つの特殊効果がある。
1,フィールド変数の実態が一つだけ用意される(「クラス名.静的フィールド名」でアクセス)。
2,全インスタンスに箱の分身が準備される(中身は全て同一でインスタンス経由でアクセスができる)。
3,インスタンスを一つも生み出さなくても箱が利用可能。
・staticはfinalやpublicと一緒に指定され変化しない定数を各インスタンスで共有するために利用される事が多い。(public static finalコンビネーション)
・静的メソッドメソッド自体が各クラスに属しクラス名.メソッド名();のような形で使用できる。
・インスタンス変数名.メソッド名();でも呼び出すことが可能。
・インスタンスを呼び出さずに使うことができる静的メソッドはstaticがついているフィールドやメソッドしか使用できない