■ Java 継承
□ 継承とは?
・あるクラスを元にして別のクラスを作成する
・既存製品の設計書を元に新製品の設計書を作成するようなもの
・乗用車 ← スポーツカー
・元のクラスを基底クラス(親クラス/スーパークラス)、新しいクラスを派生クラス(子クラス/サブクラス)と言う
・目的は、同じ(ような)処理を重複して開発しないようにする
・派生クラスは、フィールドやメソッドを基底クラスから受け継ぐ
・詳細は下を参照
・フィールド
・基底クラスのフィールドは受け継がれる
・ただしprivateフィールドにはアクセスできない
・新しいフィールドを追加できる
・コンストラクタ
・基底クラスのコンストラクタは受け継がれない
・新しいコンストラクタを追加できる
・この中で基底クラスのコンストラクタを呼出すことができる
・明示的に呼び出さなければデフォルトコンストラクタが呼び出される
・メソッド
・基底クラスのメソッドは受け継がれる
・privateは受け継がれない
・受け継いだメソッドは書き換えることができる
・public,protected
・オーバーライドと言う
・可視性を拡大することはできるが縮小することはできない
・OK:private⇒public
・NG:public⇒private
・基底クラスのメソッドを呼び出すことができる
・public,protected
・新しいメソッドを追加できる
・基底クラスのメソッドを呼び出すことができる
・public,protected
・サンプル
nyuumon5days.Inherit0
http://blogs.yahoo.co.jp/artery2020/39201613.html
□ オブジェクトの使用
・派生クラスオブジェクトは、基底クラスのリファレンスに代入できる
・基底クラスのオブジェクトを派生クラスのリファレンスに代入するときはキャストが必要
・ダウンキャストと言う
・好ましくないので、できれば使用しない
・実行時にClassCastExceptionになることがある
・オブジェクトの生成
・派生クラスで定義されたコンストラクタのみ使用できる
・メソッド呼び出し
・基底クラスと派生クラスで定義されたメソッドを呼び出すことができる
・publicのみ
・基底クラスと派生クラスの両方で同じメソッドが定義されていれば、派生クラスのメソッドが呼び出される
・サンプル
nyuumon5days.Inherit1
http://blogs.yahoo.co.jp/artery2020/39201615.html
□ 継承を使わない場合は、どうするか?
・フラグを設けて、それをif文で判断して処理を切り分ける
・例、管理職クラス⇒社員クラスで継承を使わない
boolean manager;
..
manager = ....;
..
if (manager) {
..
}
else {
..
}
・サンプル
nyuumon5days.Inherit2
http://blogs.yahoo.co.jp/artery2020/39201618.html
□ 抽象クラス
・抽象クラスとは?
・classにabstractがついている
・メソッドにabstractがついている - メソッドの中身がない
・必須ではない
・オブジェクトを生成できない
・抽象クラスをなぜ使うのか?
・メソッドの定義をしたくないため
・派生クラスでメソッド定義を強制させたいため
・newさせたくないため
・具象概念ではあっても、派生クラスが前提なのでnewさせたくない
・インターフェースのアダプタ ← 抽象クラスの必然性なし
・インターフェースを実装するためには、すべてのメソッドを実装
・数が多いと面倒
・処理がないメソッドを実装する
・デフォルトの実装を提供する
・共通的な抽象概念の定義 ← 抽象クラスの必然性なし
・猫や犬を具象クラスとする
・両者の基底クラスとして哺乳類を定義
・哺乳類という動物はいないので、抽象クラスにする
・参考
・具象クラスを継承して抽象クラスを定義できる
サンプル
nyuumon5days.Abstract00
http://blogs.yahoo.co.jp/artery2020/39201620.html
□ 補足・蛇足
・クラス階層の定義
・絶対の正解はない
・構築するシステムによって、クラス階層は異なってくる
・ボリモフィズムは以下の理由で解説していない
・ボリモフィズムは、継承とオーバーライドを導入すれば、自然に実現される機能である
・ボリモフィズムは動作としては重要だが、「ここでボリモフィズムを使おう!」と意識しなくてもプログラミングできる機能である。
・派生クラスで同一名称のフィールドを定義する
・エラーにはならない
・派生クラスで、当該名称にアクセスした場合は、派生クラスのフィールドにアクセスし、基底クラスのフィールドにはアクセスできない
・バグの原因となるので、同一名称のフィールドは定義しない
・finalでクラスとメソッドの継承を禁止する
・final宣言されたクラスは継承ができない
・final宣言されたメソッドはオーバーライドできない
・状況に応じて適切に使用する
・単一継承と多重継承
・単一継承 - 基底クラスは一つ
・多重継承 - 基底クラスは複数
・Javaは単一継承
・多重継承には、微妙な問題が発生することがある
・staticメソッドはオーバーライドできない
・クラス初期化ブロックとインスタンス初期化ブロックは継承できない
-----------------------------------------------------
・目次 Java システム開発
http://blogs.yahoo.co.jp/artery2020/40586660.html
・目次 - Java入門
http://blogs.yahoo.co.jp/artery2020/39975776.html
・目次 - ビジネスパーソンの常識と非常識
http://blogs.yahoo.co.jp/artery2020/39728331.html
・目次 - 論理・発想・思考についての考察と鍛え方
http://blogs.yahoo.co.jp/artery2020/39657784.html
-----------------------------------------------------