Javaのオブジェクト指向プログラミング:継承・抽象クラス・インターフェース・ポリモーフィズム

継承

継承とは既存のクラス(スーパークラス)を基にして新しいクラス(サブクラス)を作成する仕組みです。サブクラスはスーパークラスのフィールドとメソッドを引き継ぎます。

class SuperClass {
    // スーパークラスの内容
}

class SubClass extends SuperClass {
    // サブクラスの内容
}

継承における注意点:

  • Javaでは単一継承のみサポートされ、多重継承は許可されていません
  • 複数のクラスが同一のスーパークラスを継承できます
  • 継承チェーンが形成されることもあります

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

スーパークラスのメソッドをサブクラスで再定義することをオーバーライドと呼びます。

superキーワード

オーバーライド後、スーパークラスのメンバーにアクセスするために使用します。

  • super.フィールド名
  • super.メソッド名(引数リスト)

finalキーワード

  • final修飾クラスは継承できません
  • final修飾メソッドはオーバーライドできません
  • final修飾変数は定数であり、変更不可です

抽象クラスとインターフェース

抽象クラス

抽象メソッドは実装本体を持たず、宣言のみ行います。

abstract class AbstractClassName {
    // フィールド
    
    // 通常メソッド
    public ReturnType methodName(Parameters) {
        return value;
    }
    
    // 抽象メソッド
    public abstract ReturnType abstractMethodName(Parameters);
}

抽象クラスのルール:

  • 抽象メソッドを含むクラスは必ず抽象クラスである必要があります
  • 抽象メソッドの宣言にはabstractキーワードを使用
  • 抽象メソッドは宣言のみで実装不要
  • 非抽象クラスが抽象クラスを継承する場合、すべての抽象メソッドを実装する必要あり

インターフェース

単一継承の制限を解消し、複数のインターフェースを実装可能にします。

interface InterfaceName [extends OtherInterfaces...] {
    DataType CONSTANT_NAME = value;
    ReturnType methodName(Parameters);
    static ReturnType staticMethodName(Parameters) { }
    default ReturnType defaultMethodName(Parameters) { }
}

インターフェース実装クラスの定義:

modifier class ClassName implements Interface1, Interface2... {
    // 実装内容
}

ポリモーフィズム

異なるクラスのオブジェクトが同じメソッド呼び出しに対して異なる振る舞いを示す特性です。

ポリモーフィズムの形式

  1. メソッドのオーバーロード
  2. オブジェクトのポリモーフィズム(メソッドのオーバーライド)

オブジェクト型変換

アップキャスト:サブクラス→スーパークラス

Dog dog = new Dog();
Animal animal = dog;

ダウンキャスト:スーパークラス→サブクラス

Animal animal = new Dog();
Dog dog = (Dog) animal;

instanceofキーワード

オブジェクトが特定のクラスまたはインターフェースのインスタンスかどうかを判定します。

Objectクラス

すべてのクラスの最上位スーパークラスで、暗黙的に継承されます。

  • equals(): 2つのオブジェクトの等価性判定
  • hashCode(): オブジェクトのハッシュ値取得
  • toString(): オブジェクトの文字列表現

内部クラス

メンバ内部クラス

外部クラスのすべてのメンバーにアクセス可能です。

OuterClass outerObj = new OuterClass();
OuterClass.InnerClass innerObj = outerObj.new InnerClass();

ローカル内部クラス

メソッド内で定義され、外部クラスのメンバー変数とメソッドにアクセスできます。

スタティック内部クラス

static修飾されたメンバ内部クラスで、外部クラスの静的メンバーのみアクセス可能。

OuterClass.StaticInnerClass obj = new OuterClass.StaticInnerClass();

匿名内部クラス

名前のない内部クラスで、簡潔な実装が可能です。

new ParentClassOrInterface() {
    // 匿名クラスの実装
};

タグ: Java OOP inheritance abstract-class interface

5月16日 11:08 投稿