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

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

関連記事

サーブレットとは?その役割やHelloWorldサンプルコードのご紹介

(0)目次&概説 (1) サーブレットの基本  (1-1) サーブレットとは?  (1-2) サーブレットの前身技術との比較  (1-3) サーブレットとJSPの違い  (1-4) サーブレットのHe …

オープンアドレス法をJavaで実装したプログラムのサンプルをご紹介

<目次> (1) オープンアドレス法をJavaで実装したプログラムのサンプルをご紹介  (1-1) オープンアドレス法とは  (1-2) Javaのサンプルプログラムの全体像  (1-3) Javaの …

Servlet/JSPで日本語文字が「???」になる問題とFilterの活用について

(0)目次&概説 (1) 事象 (2) 原因 (3) 対処方法1  (3-1) フィルタクラスの新規作成  (3-2) フィルタクラスへのコード追加  (3-3) 疎通確認テスト (4) 対処方法2 …

JavaでJSON配列から値を抽出する方法+郵便番号検索APIのサンプルプログラムも紹介

(0)目次&概説 (1) 記事の目的  (1-1) 目的  (1-2) 前提条件 (2) JSON配列から値抽出する方法  (2-1) JSON配列のデータの構造例  (2-2) JSON配列のデータ …

サーバサイドJava(JSP&サーブレット)における画面遷移の手法とそのサンプルコードの紹介

(0)目次&概説 (1) 画面遷移の代表手法  (1-1) フォワード  (1-2) リダイレクト (2) 画面遷移手法のご紹介  (2-1) 方法1:formタグ+Submitボタン(JSP/Ser …

  • English (United States)
  • 日本語
Top