【はじめてのJava】クラスの継承とList【クラスの継承編】
はじめてのJava
このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。
クラスの継承編
クラスの継承編では、Javaを扱う上で重要な「クラスの継承」について扱っていきます。
前回はポリモフィズムと配列を扱いました。今回はポリモフィズムとリストを組み合わせていきます。
目次
クラスの継承とCollection
ポリモフィズムの考え方と、配列やCollection、Mapを組み合わせるととても柔軟なプログラムが書けるようになります。
前回同様、以下のようなCarクラス、PoliceCarクラス、Ambulanceクラスを使ってみていきましょう。
Carクラス
public class Car { public int speed; public void accell(){ this.speed += 10; } }
PoliceCarクラス
public class PoliceCar extends Car { @Override public void accell(){ this.speed += 20; } }
Ambulanceクラス
public class Ambulance extends Car { @Override public void accell(){ this.speed += 5; } }
前回は「Carの配列」を作り、その中に「PoliceCar」や「Ambulance」のオブジェクトを入れました。
今回は「List<Car>」を作成し、同様のことをやってみましょう。(今回はListの実装クラスとしてArrayListを用いますが、ほかのListでも同様です。)
配列の時は以下のようなソースコードでした。
ソースコード
Car cars[] = { new PoliceCar(), new Car(), new Ambulance(), new PoliceCar()};
これをListで実装する場合、次のようにします。
ソースコード
List<Car> carList = new ArrayList<Car>(); carList.add( new PoliceCar() ); carList.add( new Car() ); carList.add( new Ambulance() ); carList.add( new PoliceCar() );
Listの場合でも、配列の時同様、実態に応じたaccell()が動きます。ただし、配列とListでは記述方法が少々異なります。
配列の時はインデックスを利用してそのままオブジェクトを利用できました。
for(int i = 0; i < cars.length; i++){ cars[i].accell(); }
Listを使う場合は、get()メソッドで一度オブジェクトを取得し、その後利用します。
なお、★のように、メソッドチェインを使って取得と利用を1行で行うこともできます。(どちらで記述するかは「可読性」「動作スピード」「どういった動作をさせたいか」などに基づいて使い分けます。)
for(int i = 0; i < carList.size(); i++){ Car c = carList.get(i); c.accell(); //carList.get(i).accell(); //★今回は1行でこのように記述しても動く }
また、拡張for文を使うと、配列もListも同じ要領で利用できます。
拡張for文
for(Car c : carList){ System.out.println(c.speed); }
ソースコード
今回のソースコードは以下です。すべてCarArrayMainクラスと同じフォルダに保存して実行してください。
Carクラス
public class Car { public int speed; public void accell(){ this.speed += 10; } }
PoliceCarクラス
public class PoliceCar extends Car { @Override public void accell(){ this.speed += 20; } }
Ambulanceクラス
public class Ambulance extends Car { @Override public void accell(){ this.speed += 5; } }
CarListMainクラス(動作確認用クラス)
import java.util.List; import java.util.ArrayList; public class CarListMain{ public static void main(String[] args){ List<Car> carList = new ArrayList<Car>(); carList.add( new PoliceCar() ); carList.add( new Car() ); carList.add( new Ambulance() ); carList.add( new PoliceCar() ); for(int i = 0; i < carList.size(); i++){ Car c = carList.get(i); c.accell(); //carList.get(i).accell(); //今回は1行でこのように記述しても動く } //以下動作確認用 for(Car c : carList){ System.out.println(c.speed); } } }
まとめ
ポリモフィズムを配列やCollection、Mapなどと組み合わせるとプログラムの柔軟性が上がる。
次回
次回は別の切り口でプログラムの設計について考えていきます。
はじめてのJavaシリーズの目次はこちら
クラスの継承編はこちら