抽象クラス-saka

abstract class Vehicle{}
①abstract修飾子がついたクラス。(他のクラスから)オブジェクト化することができない。

    • -

Vehicle vc; ←抽象クラス型変数の宣言はできる。
vc = new Vehicle(); ←これは無理

    • -

②抽象メソッド(処理内容の定義されていないメソッド)を持っている。
abstract void show(); ←処理内容を持たないメソッド。
abstract void show(){}; ←これ間違い。{}つけない。
【補足】処理内容のあるメソッドも持てる。

    • -

■抽象クラスのメリット
抽象クラスをオーバーライドしたサブクラスを、抽象クラス型の変数で扱うことができる。氏名の苗字みたいなもので、それ自体は誰も指さないけれどざっくりとそれをスーパークラスとして持つ人全体をまとめて扱うことができる。(田中兄弟、田中一郎、田中二郎を「田中[1]obj、田中[2]objとして扱う。これが抽象クラス「田中」。これに対して具象メソッドは一郎obj、二郎obj)
Vehicle[] vc = new Vehicle[2]; //vcをVehicleオブジェクトを宣言しつつ、配列数をふたつ確保している。
vc[0] = new Car(1234,20.5); //CarオブジェクトをVehicle型変数へ
vc[1] = new Plane(666); //PlaneオブジェクトをVehicle型変数へ

    • -

【注意点1】
スーパークラス型にサブクラスのオブジェクトを代入した場合の注意点は、スーパークラス型の変数ではサブクラスが独自にもっているメソッドを実行することができない。ということ。
田中一族で例えると、代々脳みそが筋肉でできているというマッチョマッチョで知られる田中一族に学究肌の田中五郎が生まれました。が、田中というスーパークラスで語られる場合においては田中五郎の文学的才能に関しては無視され五郎もマッチョと見なされる。ということ。
【注意点2】
抽象クラスが持つメソッドはサブクラスも必ず持たないといけない。
田中一族で例えると、マッチョという属性を持つのは田中一族においては運命のようなものでマッチョでなければ田中にあらず。マッチョ属性を持たない田中は認められない。一郎は野球マッチョ。二郎はラグビーマッチョ。いろんなマッチョがあるけれど。みんなマッチョ。

    • -

■instanceof演算子
オブジェクト名 instanceof クラス名;
System.out.println(vc[0] instanceof Car);
この記述でtrueかfalseを返してくる。クラス名はスーパークラスで一致してもサブクラスで一致してもtrue。田中一郎であれば、田中でtrue、一郎でもtrueということ。