【Java】継承について(サブクラス/スーパークラスの定義方法や使い方について)

Java

はじめに

今回はJavaの「継承」について勉強したことを記載していきたいと思います。

 

継承とは

継承とは、クラスを元に新しいクラスを定義することができる機能のことです。複数のクラスに共通する項目を継承することで、共通項目を1つのクラスで管理することができ、可読性の向上やステップ数の削減を行うことができます。元になるクラスのことを親クラス、継承するクラスのことを子クラスと呼びます。

 

継承元となるクラス 親クラスやスーパークラスと呼ばれる
継承するクラス 子クラスやサブクラスと呼ばれる

 

定義

修飾子 class クラス名 extends 継承元クラス名 {
}

 

package package1;

public class User {
    /**
     * ユーザID
     */
    private int UserId;

    /**
     * ユーザID設定
     * @param userID
     */
    public void SetUserId(int userID) {
        this.UserId = userID;
    }

    /**
     * ユーザID取得
     * @return
     */
    public int GetUserId() {
        return UserId;
    }
}
package package1;

public class Engineer extends User {
    /**
     * スキル
     */
    private String Skill;

    /**
     * スキル設定
     * @param skill
     */
    public void setSkill(String skill) {
        this.skill = skill;
    }

    /**
     * スキル取得
     */
    public String getSkill() {
        return Skill;
    }
}

 

継承時に意識すること

継承を実施する際に、何も考えずただ共通の項目があるからという理由で行ってしまうとコーディングを進めていくうちに難解で矛盾が発生した継承関係を持つクラスが増えていってしまいます。そこで意識しなければいけないことが「is-a関係」になります。「子クラスは親クラスの1種である」ということを意識すると良いといわれています。

例)
・猫が動物の1種である
・車は乗り物の1種である

 継承関係を結んでいくと、子クラスになればなるほど具体的なものになり、親クラスになるほど抽象的なものになっていく、枠組みを作りながらより具体的なものを作り上げていくイメージを私は持っています。

 

オーバーロード

オーバーロードとは、一つのクラスに同じ名前のメソッドやコンストラクタを定義することが可能な機能のことです。データの型・引数の数や並び順の違うことで同一の名前のメソッドでも、別のメソッドとして判断されます。

 

package package1;

public class Engineer extends User {
    /**
     * スキル
     */
    private String Skill;

    /**
     * スキル設定
     * 
     * @param skill
     */
    public void setSkill(String skill) {
        this.skill = skill;
    }

    /**
     * スキル取得
     */
    public String getSkill() {
        return Skill;
    }

    /**
     * スキル出力
     */
    public void ptintSkill() {
        System.out.println(Skill);;
    }

    /**
     * スキル出力
     */
    public void ptintSkill(String message) {
        System.out.println(message + this.Skill);
    }
}

 

オーバーライド

オーバーライドとは、スーパークラスで定義したメソッドをデータの型・引数の数や並び順が全く同じ状態のままサブクラスで再定義することができる機能のことです。
同じ機能だけどスーパークラスとサブクラスでで違う振る舞いをする際によく使用されます。

 

package package1;

public class User {
    /**
     * ユーザID
     */
    private int UserId;

    /**
     * ユーザID設定
     * @param userID
     */
    public void SetUserId(int userID) {
        this.UserId = userID;
    }

    /**
     * ユーザID取得
     * @return
     */
    public int GetUserId() {
        return UserId;
    }

    /**
     * メッセージ出力
     */
    public void ptintMessage() {
        System.out.println("Userクラスです");
    }
}
package package1;

public class Engineer extends User {
    /**
     * スキル
     */
    private String Skill;

    /**
     * スキル設定
     * 
     * @param skill
     */
    public void setSkill(String skill) {
        this.skill = skill;
    }

    /**
     * スキル取得
     */
    public String getSkill() {
        return Skill;
    }

    /**
     * メッセージ出力
     */
    @Override
    public void ptintMessage() {
        System.out.println("Engineerクラスです");
    }
}

 

thisとsuperについて

「this」は自分自身を表し「super」は親クラスのことを表します。

this 現在の自分自身の暮らすのことを指す
super 継承元のスーパークラスのことを指す

 

package package1;

public class Engineer extends User {
    /** 
     * コンストラクタ
    */
    public Engineer() {
        this.ptintMessage();
        super.ptintMessage();
    }

    /**
     * メッセージ出力
     */
    @Override
    public void ptintMessage() {
        System.out.println("Engineerクラスです");
    }
}

 

継承・オーバーライド禁止設定

クラスやメソッドに「final」をつけることで、継承やオーバーライドを制限することができます。

 

定義

// ファイナルクラス(継承禁止)
修飾子 final class クラス名 {
    
}

修飾子 class クラス名 extends 継承元クラス名 {
    // ファイナルメソッド(オーバーライド禁止)
    修飾子 final データ型 メソッド名() {

    }
}

 

ドキュメント

【公式ドキュメント】
Java SE Specifications (oracle.com)

 

最後に

Javaの環境構築は、この記事を参照してみてください。
【開発環境構築】VS CodeでJavaを使用するための環境構築を実施する – SEもりのLog (selifemorizo.com)

以上、ログになります。
これからも継続していきましょう!!

Javaサーバーサイド関連
おすすめIT本
良いコード/悪いコードで学ぶ設計入門

「ITエンジニア本大賞2023」技術書部門で大賞を受賞した本です。
・コードの可読性
・普段意識したほうが良いこと
・リファクタリング考え方
等、普段のコードを設計する際に意識することが書かれています。
コードのあるべき姿に迷ったら一度読んでみると良い本です。

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん

Dockerって何?となったときに私が最初に読んだ本です。
Dockerがどんな仕組みで動いているのか、コマンドでは何を命令しているのかを理解できるように、イラストを多用して説明しています。

1冊ですべて身につくJavaScript入門講座

「ITエンジニア本大賞2024」技術書部門で大賞を受賞した本です。
私が次に読もうと思っている本なのでおすすめとして挙げておきたいと思います。

コメント

タイトルとURLをコピーしました