Loading [MathJax]/extensions/tex2jax.js

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」のスーパークラスです。ここでは全ての車に共通する属性(名前、車高、車重など)を定義しています。

  1. //↓パッケージ名は各自の環境に合わせて変更ください。
  2. package training2;
  3.  
  4. class Car {
  5. String name;
  6. String manufacturer;
  7. double weight; double height; double width; double length;
  8.  
  9. void setInfoCar(String a_name, String a_mnfct, double a_weight, double a_height, double a_width, double a_length) {
  10. name = a_name;
  11. manufacturer = a_mnfct;
  12. weight = a_weight;
  13. height = a_height;
  14. width = a_width;
  15. length = a_length;
  16. }
  17.  
  18. void displayInfoCar() {
  19. System.out.println("Name of Car: "+name);
  20. System.out.println("Manufacturer: "+manufacturer);
  21. System.out.println("Weight of Car: "+weight);
  22. System.out.println("Height of Car: "+height);
  23. }
  24.  
  25. }

目次にもどる

(1-3-2) Truckクラス

次のプログラムは「Truck」サブクラスです。ここでは車の中でもトラックに特有の性質(荷台の積載重量など)を定義しています。

  1. package training2;
  2.  
  3. class Truck extends Car {
  4.  
  5. double currLoad; double maxLoad; String result;
  6.  
  7. void setInfoTrk(double a_currLoad, double a_maxLoad) {
  8. currLoad = a_currLoad;
  9. maxLoad = a_maxLoad;
  10. }
  11.  
  12. void checkTrk() {
  13. result = (currLoad >= maxLoad) ? "Load exceeding the Maximum (NG)" : "Load is within the Maximum (OK)";
  14. }
  15.  
  16. void displayInfoTrk() {
  17. System.out.println("Current Load: "+currLoad);
  18. System.out.println("Maximum Load: "+maxLoad);
  19. System.out.println("Check of Load: "+result);
  20. }
  21. }

目次にもどる

(1-3-3) Mainメソッド

次のプログラムはMainメソッドです。

  1. package training2;
  2. import java.util.*;
  3.  
  4. public class InheritMain {
  5. public static void main(String args[]) {
  6.  
  7. Truck trk = new Truck();
  8.  
  9. //1.Call the method in SuperClass "Car"
  10. // [name, manufacturer, weight, height, width, length]
  11. trk.setInfoCar("SAMBAR Truck", "SUBARU", 760.0, 1780.0, 1475.0, 3395.0);
  12. trk.displayInfoCar();
  13.  
  14. //2.Call the method in SubClass "Truck"
  15. trk.setInfoTrk(50.0, 350.0);
  16. trk.checkTrk();
  17. trk.displayInfoTrk();
  18. }
  19. }

目次にもどる

(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」のスーパークラスです(「継承」の時と全く同じです)。

  1. package training2;
  2.  
  3. class Car {
  4. String name;
  5. String manufacturer;
  6. double weight; double height; double width; double length;
  7.  
  8. void setInfoCar(String a_name, String a_mnfct, double a_weight, double a_height, double a_width, double a_length) {
  9. name = a_name;
  10. manufacturer = a_mnfct;
  11. weight = a_weight;
  12. height = a_height;
  13. width = a_width;
  14. length = a_length;
  15. }
  16.  
  17. void displayInfoCar() {
  18. System.out.println("Name of Car: "+name);
  19. System.out.println("Manufacturer: "+manufacturer);
  20. System.out.println("Weight of Car: "+weight);
  21. System.out.println("Height of Car: "+height);
  22. }
  23.  
  24. }

目次にもどる

(2-4-2) Truckクラス

次のプログラムは「Truck」サブクラスです。先ほどの「継承」の時のサンプルと殆ど同じですが、唯一異なるのは「displayInfoCar()」メソッドが「Car」クラスのオーバーライドメソッドである点です。

  1. package training2;
  2. class Truck extends Car {
  3.  
  4. double currLoad; double maxLoad; String result;
  5.  
  6. void setInfoTrk(double a_currLoad, double a_maxLoad) {
  7. currLoad = a_currLoad;
  8. maxLoad = a_maxLoad;
  9. }
  10.  
  11. void checkTrk() {
  12. result = (currLoad >= maxLoad) ? "Load exceeding the Maximum (NG)" : "Load is within the Maximum (OK)";
  13. }
  14.  
  15. void displayInfoCar() {
  16. System.out.println("Name of Car: "+name);
  17. System.out.println("Manufacturer: "+manufacturer);
  18. System.out.println("Weight of Car: "+weight);
  19. System.out.println("Height of Car: "+height);
  20. System.out.println("Current Load: "+currLoad);
  21. System.out.println("Maximum Load: "+maxLoad);
  22. System.out.println("Check of Load: "+result);
  23. }
  24. }

目次にもどる

(2-4-3) Mainメソッド

次のプログラムはMainメソッドです。「継承」の時と異なる点として、「displayInfoCar」というオーバーライドメソッドで値の出力を一挙に行っている点です。

  1. package training2;
  2. import java.util.*;
  3.  
  4. public class InheritMain {
  5. public static void main(String args[]) {
  6. Truck trk = new Truck();
  7.  
  8. //1.Call the method in SuperClass "Car"
  9. // [name, manufacturer, weight, height, width, length]
  10. trk.setInfoCar("SAMBAR Truck", "SUBARU", 760.0, 1780.0, 1475.0, 3395.0);
  11.  
  12. //2.Call the method in SubClass "Truck"
  13. trk.setInfoTrk(50.0, 350.0);
  14. trk.checkTrk();
  15. trk.displayInfoCar();
  16. }
  17. }

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

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

関連記事

Javaの選択ソートとは?アルゴリズムの流れ+サンプルプログラムをご紹介

<目次> (1) バイナリ―サーチとは?Javaのサンプルプログラムを用いて解説  (1-1) バイナリ―サーチのアルゴリズム  (1-2) バイナリ―サーチの性能(処理回数)  (1-3) バイナリ …

Twitter APIのRate Limit Exceedエラー(code – 88)の意味について

  <目次> (1) Twitter APIのRate Limit Exceedエラー(code – 88)の意味について  (1-1) APIコールのリミット(Rate Limit)につい …

TwitterAPIのJavaでの使い方をご紹介~【入門編】Twitter4j導入~ハッシュタグでツイート検索するまで~

<目次> (1) TwitterAPIのJavaでの使い方をご紹介  (1-1) STEP0:前提条件  (1-2) STEP1:ライブラリ(jar)のダウンロード  (1-3) STEP2:アプリケ …

GitHubのWebAPIをコールしてユーザー情報を取得するサンプルプログラムの解説+エラー対応も2例紹介

(0)目次&概説 (1) 目的  (1-1) 記事の目的 (2) APIの概要  (2-1) APIとは?  (2-2) Web APIとは?  (2-3) Web APIの様々な呼び方   (2-3 …

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

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

  • English (United States)
  • 日本語
S