Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Javaの継承やオーバーライドとは?特徴の解説とサンプルプログラムの紹介

投稿日:2019年11月3日 更新日:

(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) 継承の特徴

(1) Javaではスーパークラスを1つしか指定できません(単一継承)
(2) 継承の主な用途①は「スーパークラスに無い独自の性質を定義する」こと
(3) 継承の主な用途②は「スーパークラスの性質を再定義する」こと(オーバーライド)

(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) オーバーライドとは?

スーパークラスにて定義しているメソッドを、サブクラスにて再定義する事です。
例えば、下記の例では「車」クラスの「displayInfoCar」というメソッドを、サブクラスである「トラック」にてオーバーライドしています。

オーバーライドをする事で、開発者が把握するメソッド数が少なくて済みますし、メソッド同士の関係性を把握する事も容易になります。

  >目次にもどる

(2-2) オーバーライドの特徴

(1) オーバーライドの作法
オーバーライドする際は、「①メソッド名」と「②引数の型と個数と順番」と「③戻り値の型」を揃える必要があります。もし上記①~③の条件が揃っていないと、次の例のようにオーバーライドされません。

この例では「Car」クラスの「displayInfoCar」メソッドは引数が「String AAA」に対して、「Truck」クラスでは「displayInfoCar」メソッドの引数は「なし」で異なっています。

この状態で「Truck」オブジェクトを作り、引数をString型の「AAA」で実行すると、スーパークラス「車」の「displayInfoCar」が呼び出されます。

逆のパターンで、「Car」クラスは引数なしで「Truck」クラスは引数が「String AAA」の場合も同じく引数が異なっておりオーバーライドに失敗しています。例えば「Truck」側のメソッドのアクセス修飾子に「private」を付けてもエラーにならない事から、オーバーライドされていない状況である事が分かります。

(2) アクセス修飾子の制限
オーバーライドする際に、アクセス修飾子はスーパークラスのそれよりも広い公開範囲にする必要があります。

 

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

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

Newton法で平方根を求めるJavaのサンプルプログラム+操作動画もご紹介

<目次> (1) Newton法で平方根を求めるJavaのサンプルプログラム  (1-1) Newton法の式を簡単に復習  (1-2) Newton法のサンプルプログラム (1) Newton法で平 …

502 Proxy Error : Reason: Error reading from remote serverの原因と解消法メモ

<目次> (1) 502 Proxy Error : Reason: Error reading from remote serverの原因と解消法メモ  (1-1) 発生状況・エラーメッセージ  ( …

Javaのthisとは?コンストラクタで引数を与えている場合・メソッド引数に使われる場合もご紹介

<目次> (1) Javaのthisとは?コンストラクタに出現する場合やメソッド引数に使われる場合もご紹介  (1-1) thisとは?  (1-2) 用途1:自分自身を指定【重要】  (1-3) 用 …

Javaのメソッドで複数の戻り値を返却する方法

<目次> (1) Javaのメソッドで複数の戻り値を返却する方法  (1-1) 同じ型の値を複数返却したい場合 ⇒ 配列やList   ◎ポイント   ◎サンプル  (1-2) 異なる型の関連する値を …

JSP/Servletでログイン・ログアウト機能を作成する方法

<目次> (1) JSP/Servletでログイン・ログアウト機能を作成する方法  (1-1) ログイン   (1-1-1) 概要・構文   (1-1-2) サンプルプログラム  (1-2) ログアウ …

  • English (United States)
  • 日本語
Top