(0)目次&概説
(1) 継承/Inherit
(1-1) 継承とは?
(1-2) 継承の特徴
(1-3) 継承のサンプルコード
(1-3-1) Carクラス
(1-3-2) Truckクラス
(1-3-3) Mainメソッド
(2) オーバーライド/Override
(2-1) オーバーライドとは?
(2-2) オーバーライドの特徴
(2-3) オーバーライドしたくない場合
(2-4) オーバーライドのサンプルコード
(2-4-1) Carクラス
(2-4-2) Truckクラス
(2-4-3) Mainメソッド
(1) 継承/Inherit
(1-1) 継承とは?
(1-2) 継承の特徴
(4) スーパークラスで定義したメンバ変数やメソッドは「継承」で受け継がれるため、再定義は不要(差分プログラミング)
(1-3) 継承のサンプルコード
(1-3-1) Carクラス
次のプログラムは「Car」クラスで、サブクラス「Truck」のスーパークラスです。ここでは全ての車に共通する属性(名前、車高、車重など)を定義しています。
//↓パッケージ名は各自の環境に合わせて変更ください。 package training2; class Car { String name; String manufacturer; double weight; double height; double width; double length; void setInfoCar(String a_name, String a_mnfct, double a_weight, double a_height, double a_width, double a_length) { name = a_name; manufacturer = a_mnfct; weight = a_weight; height = a_height; width = a_width; length = a_length; } void displayInfoCar() { System.out.println("Name of Car: "+name); System.out.println("Manufacturer: "+manufacturer); System.out.println("Weight of Car: "+weight); System.out.println("Height of Car: "+height); } }
(1-3-2) Truckクラス
次のプログラムは「Truck」サブクラスです。ここでは車の中でもトラックに特有の性質(荷台の積載重量など)を定義しています。
package training2; class Truck extends Car { double currLoad; double maxLoad; String result; void setInfoTrk(double a_currLoad, double a_maxLoad) { currLoad = a_currLoad; maxLoad = a_maxLoad; } void checkTrk() { result = (currLoad >= maxLoad) ? "Load exceeding the Maximum (NG)" : "Load is within the Maximum (OK)"; } void displayInfoTrk() { System.out.println("Current Load: "+currLoad); System.out.println("Maximum Load: "+maxLoad); System.out.println("Check of Load: "+result); } }
(1-3-3) Mainメソッド
次のプログラムはMainメソッドです。
package training2; import java.util.*; public class InheritMain { public static void main(String args[]) { Truck trk = new Truck(); //1.Call the method in SuperClass "Car" // [name, manufacturer, weight, height, width, length] trk.setInfoCar("SAMBAR Truck", "SUBARU", 760.0, 1780.0, 1475.0, 3395.0); trk.displayInfoCar(); //2.Call the method in SubClass "Truck" trk.setInfoTrk(50.0, 350.0); trk.checkTrk(); trk.displayInfoTrk(); } }
(2) オーバーライド/Override
(2-1) オーバーライドとは?
オーバーライドをする事で、開発者が把握するメソッド数が少なくて済みますし、メソッド同士の関係性を把握する事も容易になります。
(2-2) オーバーライドの特徴
(1) オーバーライドの作法
オーバーライドする際は、「①メソッド名」と「②引数の型と個数と順番」と「③戻り値の型」を揃える必要があります。もし上記①~③の条件が揃っていないと、次の例のようにオーバーライドされません。
この例では「Car」クラスの「displayInfoCar」メソッドは引数が「String AAA」に対して、「Truck」クラスでは「displayInfoCar」メソッドの引数は「なし」で異なっています。
逆のパターンで、「Car」クラスは引数なしで「Truck」クラスは引数が「String AAA」の場合も同じく引数が異なっておりオーバーライドに失敗しています。例えば「Truck」側のメソッドのアクセス修飾子に「private」を付けてもエラーにならない事から、オーバーライドされていない状況である事が分かります。
オーバーライドする際に、アクセス修飾子はスーパークラスのそれよりも広い公開範囲にする必要があります。
(3) オーバーライドメソッドを実行
オーバーライドした際に、サブクラスの該当メソッドを呼び出すと、サブクラス側のメソッドを実行してくれます。
(2-3) オーバーライドしたくない場合
スーパークラスのメソッドの修飾子として「final」修飾子を付けて明示的に宣言する事ができます。メソッドが既に最終形になっており、これ以上のオーバーライドが必要ない場合などで指定できます。
下記の例では「Car」クラスの「displayInfoCar」に「final」修飾子を付ける事で、「Truck」クラスでオーバーライドしようとするとエラーになります。
(Cannot Override the final method from Car)
(2-4) オーバーライドのサンプルコード
(2-4-1) Carクラス
次のプログラムは「Car」クラスで、サブクラス「Truck」のスーパークラスです(「継承」の時と全く同じです)。
package training2; class Car { String name; String manufacturer; double weight; double height; double width; double length; void setInfoCar(String a_name, String a_mnfct, double a_weight, double a_height, double a_width, double a_length) { name = a_name; manufacturer = a_mnfct; weight = a_weight; height = a_height; width = a_width; length = a_length; } void displayInfoCar() { System.out.println("Name of Car: "+name); System.out.println("Manufacturer: "+manufacturer); System.out.println("Weight of Car: "+weight); System.out.println("Height of Car: "+height); } }
(2-4-2) Truckクラス
次のプログラムは「Truck」サブクラスです。先ほどの「継承」の時のサンプルと殆ど同じですが、唯一異なるのは「displayInfoCar()」メソッドが「Car」クラスのオーバーライドメソッドである点です。
package training2; class Truck extends Car { double currLoad; double maxLoad; String result; void setInfoTrk(double a_currLoad, double a_maxLoad) { currLoad = a_currLoad; maxLoad = a_maxLoad; } void checkTrk() { result = (currLoad >= maxLoad) ? "Load exceeding the Maximum (NG)" : "Load is within the Maximum (OK)"; } void displayInfoCar() { System.out.println("Name of Car: "+name); System.out.println("Manufacturer: "+manufacturer); System.out.println("Weight of Car: "+weight); System.out.println("Height of Car: "+height); System.out.println("Current Load: "+currLoad); System.out.println("Maximum Load: "+maxLoad); System.out.println("Check of Load: "+result); } }
(2-4-3) Mainメソッド
次のプログラムはMainメソッドです。「継承」の時と異なる点として、「displayInfoCar」というオーバーライドメソッドで値の出力を一挙に行っている点です。
package training2; import java.util.*; public class InheritMain { public static void main(String args[]) { Truck trk = new Truck(); //1.Call the method in SuperClass "Car" // [name, manufacturer, weight, height, width, length] trk.setInfoCar("SAMBAR Truck", "SUBARU", 760.0, 1780.0, 1475.0, 3395.0); //2.Call the method in SubClass "Truck" trk.setInfoTrk(50.0, 350.0); trk.checkTrk(); trk.displayInfoCar(); } }