Javaのクラス、継承、リフレクション
クラスの3つの役割
・型
・実装
・インスタンス生成器
※抽象クラス、インターフェイスは、「インスタンス生成器」を放棄
単一責任の原則
1つのクラスには、1つの明確な責任だけを担わせよう、というプログラミング原則
クラスとオブジェクト
・クラスをインスタンス化して新しいオブジェクトにする
・オブジェクトはクラスのインスタンス(型枠に中身を入れて実体化したもの)とも言える
クラス名2種
・単純名
・完全限定名
クラスのメンバ
・変数(=プロパティ、フィールド)
・メソッド
・コンストラクタ
コンストラクタとは
・特定のクラスのオブジェクトを作成して初期化する特殊なメソッドのこと
・「インスタンスの生成処理」のこと
・「インスタンスの生成処理」と「コンストラクタの起動」は同じこと
・コンストラクタは、1つのインスタンスに対しては1度しか呼べない
クラス名と型
クラス名が、インスタンスを生成する際の型になる
型 変数 = new クラス();
【例】
class X {
//内容
}
X x = new X();
→xはX型
thisキーワードの使い方2つ
・現在のオブジェクトを参照する
・コンストラクタから同じクラスに属する別のコンストラクタを明示的に呼び出す
Javaにおける引数の引渡し
値渡し
メソッドのシグネチャとは
メソッド名とパラメータのデータ型のリストを合わせたもの
クラスの修飾子
・abstract :インスタンス化できないクラス
・final :拡張できないクラス
・public :ほかのすべてのクラスから参照できるクラス
※すべて省略可能
コンストラクタの修飾子
・private :同じクラスのコードからしかアクセスできないコンストラクタ
・protected :サブクラスまたは同じパッケージ内のコードからしかアクセスできないコンストラクタ
・public :ほかのクラスからアクセスできるコンストラクタ
※すべて省略可能
実行時のポリモーフィズムとは
ポリモーフィズムとは、「多くの形態」という意味。実行時のポリモーフィズムとは、実行時に適切なメソッドの実装が選択されること
ポリモーフィズムのメリット/デメリット
明確性と引き換えに柔軟性を手に入れる
動的メソッドディスパッチとは
実行中オブジェクトのクラスに基づいて適切な実装が選択される。これにより、メソッドの実装形態が異なる複数のサブクラスをクラスから派生できるので、実行時のポリモーフィズムを実現する基盤ができる
メソッドのオーバーロードとオーバーライドの違い
メソッドのオーバーロードは、名前は同じだがシグネチャの異なるメソッドが同じクラスに複数あること。メソッドのオーバーライドとは、スーパークラスで定義されたメソッドと同じ名前とシグネチャを持つメソッドがサブクラスで定義されていること
@Overrideアノテーション
・メソッドをオーバーライドする場合、メソッド宣言の直前に付ける修飾子
・必須ではない
・オーバーライドであることを明示する
・オーバーライドが成立してない場合、コンパイルエラーとなる(→ミスを発見しやすい)
オブジェクト
・ステートレスオブジェクト:状態を持たない
・ステートフルオブジェクト:状態を持つ
ステートフルオブジェクト
・不変オブジェクト:生成(new)時にコンストラクタでステート処理した後は、一切ステートが変化しない
・可変オブジェクト:生成(new)した後も、ステートが変化する可能性がある
不要なオブジェクトの処理
obj = null;
2つのクラス同士の関係
・継承(inherit)
・使用(use)
・集約(aggregate)・コンポジション(composite)
継承関係の特徴
・抽象的なクラスを継承して具体的なクラスを作ることはあるが、逆はない
・抽象的なクラスはインスタンス化できない場合がある
extends句を省略すると
自動的に「java.lang.Objectクラス」を継承する
変数を隠す
スーパークラスの変数と同じ名前の変数をサブクラスで宣言する
コンストラクタを呼び出す手順
スーパークラスのコンストラクタを実行した後で、クラスのコンストラクタを実行する
superキーワードの用途
・1つ上のスーパークラスに定義されたメソッドまたは変数にアクセスする
・コンストラクタから、1つ上のスーパークラスに定義されたコンストラクタを明示的に呼び出す
リフレクションとは
あるオブジェクトからクラス構造を表すClassオブジェクトを取得して、そのClassオブジェクトを通じてクラス構造を操作してしまう技術
リフレクションのリスク
・柔軟なゆえに思わぬバグを作ってしまう
・実行速度が遅い