(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();
- }
- }