【第20回】初心者のJavaプログラミング【特化としての継承】
こんばんは。今回は前回の続きです。
前回は汎化の継承というものをやりました。
物事の抽象的な部分に注目し、概念の階層を構築していくのが汎化という作業です。
例えばですと、消しゴム、ボールペン、鉛筆に共通の文房具という抽象的な概念を切り出して、それを基底クラスにします。
今回は特化の継承というものをやります。
考え方は同じです。
「汎化としての継承」と「特化としての継承」
汎化としての継承は、前回説明したとおりで、基底クラスを探し出して作ることです。
それに対して、特化としての継承はその名の通りですが、派生クラスを作りだすことです。
文房具クラスから鉛筆クラス、消しゴムクラス、ボールペンクラスを作りだすのが特化です。
元のクラスがどちらかということが違うだけです。やっていることは2つとも変わりません。
ですが、どっちかというと汎化のほうが難しいなと感じます。
やっぱり文房具と鉛筆を比べると、どっちが具体的かというと、鉛筆のほうが遥かに具体的だと思います。なので、文房具クラスを基底クラスにするという風に考えることの方が難しい気がします。
Javaにおける継承
ここからは書き方の説明です。
スーパークラスとサブクラスの関係について書きます。
スーパークラスはそのクラスのオブジェクト、またはサブクラスのオブジェクトを参照できます。
よーするに、intとdoubleみたいな関係じゃないすかね?(多分違うかもw)
スーパークラスの方が大きいのでサブクラスの参照を代入してもおっけーみたいな。
これ結構重要な機能らしいです。
以下例です。
// 文房具クラス(スーパークラス) class Bunbobu {} // 文房具のサブクラス class Pencil extends Bunbobu{} class Eraser extends Bunbobu{} class BallPointPen extends Bunbobu{} class InheritanceSample { public static void main(String[] args) { // 文房具クラスの変数を準備する。 Bunbobu item; // サブクラスのオブジェクトの参照を入れる item = new Pencil(); System.out.println("Pencilオブジェクトの参照"); item = new Eraser(); System.out.println("Eraserオブジェクトの参照"); item = new BallPointPen(); System.out.println("BallPointPenオブジェクトの参照"); // 試しにサブクラスの変数にスーパークラスの参照を入れてみるが、 // コンパイルエラーが出ます // サブクラスからは親のオブジェクトを参照できないということになります。 Eraser items = new Bunbobu(); } }
親は子のアドレスを持つことができるということですね。
今日はこのくらいで。
次回は継承と変数の関係、メソッドのオーバーライド、継承におけるコンストラクタあたりを書いていこうと思います。
ではでは。