Javaにおける継承の基本概念と実装

コード実装

まず、BaseCharacterクラス(基本キャラクター)を定義します

/**
 * キャラクターの基本属性
 */
public class BaseCharacter {

    /**
     * キャラクター名
     */
    String characterName;

    /**
     * 誕生日
     */
    Date birthDate;

    /**
     * 連絡先
     */
    String contactInfo;

    /**
     * 識別コード
     */
    String identifier;

    public BaseCharacter() {
    }

    public BaseCharacter(String characterName, Date birthDate, String contactInfo, String identifier) {
        this.characterName = characterName;
        this.birthDate = birthDate;
        this.contactInfo = contactInfo;
        this.identifier = identifier;
    }

    public String getCharacterName() {
        return characterName;
    }

    public void setCharacterName(String characterName) {
        this.characterName = characterName;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public String getContactInfo() {
        return contactInfo;
    }

    public void setContactInfo(String contactInfo) {
        this.contactInfo = contactInfo;
    }

    public String getIdentifier() {
        return identifier;
    }

    public void setIdentifier(String identifier) {
        this.identifier = identifier;
    }
}

次に、Heroクラス(ヒーロークラス)がBaseCharacterクラスを継承します

/**
 * ヒーローの特有属性
 */
public class Hero extends BaseCharacter {

    /**
     * ヒーローID
     */
    private String heroId;

    /**
     * レベル
     */
    private int level;

    public Hero() {
    }

    public Hero(String characterName, Date birthDate, String contactInfo, String identifier) {
        super(characterName, birthDate, contactInfo, identifier);
    }

    public Hero(String characterName, Date birthDate, String contactInfo, String identifier, String heroId, int level) {
        super(characterName, birthDate, contactInfo, identifier);
        this.heroId = heroId;
        this.level = level;
    }

    public String getHeroId() {
        return heroId;
    }

    public void setHeroId(String heroId) {
        this.heroId = heroId;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }
}

最後に、Heroクラスの全引数コンストラクタを呼び出してテストします

public class HeroTest {
    public static void main(String[] args) {
        Hero hero = new Hero("勇者",
                new Date(),
                "123-4567-8910",
                UUID.randomUUID().toString(),
                "HERO-001",
                10);
        System.out.println("名前:" + hero.getCharacterName());
        System.out.println("誕生日:" + hero.getBirthDate());
        System.out.println("連絡先:" + hero.getContactInfo());
        System.out.println("識別コード:" + hero.getIdentifier());
        System.out.println("ヒーローID:" + hero.getHeroId());
        System.out.println("レベル:" + hero.getLevel());
    }
}

superとは何か

派生クラス(サブクラス)で基底クラス(スーパークラス)のプロパティやメソッドを呼び出す際、superキーワードを使用してスーパークラスオブジェクトを参照します。例えば、現在のクラスのプロパティ名がスーパークラスのプロパティ名と同じ場合、区別するためにsuperキーワードが導入されます。以下に例を示します:

public class BaseCharacter {

    private String characterName;

    public BaseCharacter(String characterName) {
        this.characterName = characterName;
    }

    public String getCharacterName() {
        return characterName;
    }

    public void setCharacterName(String characterName) {
        this.characterName = characterName;
    }
}

public class Hero extends BaseCharacter {

    private String heroName;

    public Hero(String characterName, String heroName) {
        super(characterName); // 親クラスのコンストラクタを呼び出す
        this.heroName = heroName;
    }

    @Override 
    public String getCharacterName() {
        return heroName;
    }

    @Override 
    public void setCharacterName(String characterName) {
        this.heroName = characterName;
    }
}

superの重要なポイント

  • superを使用して親クラスのコンストラクタを呼び出す場合、必ずコンストラクタの最初の行に記述する必要があります
  • superはサブクラスのメソッドまたはコンストラクタ内でのみ使用できます
  • superとthisを同時にコンストラクタ呼び出しに使用することはできません

メソッドのオーバーライド

クラス間に継承関係が必要です。スーパークラス(親クラス)のメソッド本体がサブクラスによって再定義されます

public class Vehicle {
    public void move(){
        System.out.println("車両が移動します");
    }
}
public class Car extends Vehicle {
    // 親クラスのmove()をオーバーライド
    @Override 
    public void move(){
        System.out.println("自動車が道路を走ります");
    }
}
public class VehicleTest {
    public static void main(String[] args) {
        Vehicle vehicle = new Car();
        vehicle.move(); // 自動車が道路を走ります

        Car car = new Car();
        car.move(); // 自動車が道路を走ります
    }
}

オーバーライドの重要なポイント

  • メソッド名、パラメータリストは同じでなければなりません
  • 修飾子の範囲は親クラスの定義以上でなければなりません:public > protected > default > private
  • 例外のスロー範囲は親クラスの定義以上でなければなりません

タグ: Java オブジェクト指向 継承 メソッドオーバーライド superキーワード

5月20日 14:32 投稿