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