System.out.println("Java学習中");

【Java / Spring Boot】UI/UXの視点を活かしたバックエンド開発の学習ポートフォリオ

【Java Silver対策】アップキャストとダウンキャストの違い

✅ アップキャストとダウンキャスト

前回はinstanceofについて解説しました。

前回の記事👇

blog.kenichikamoi.com

今回はその前提となる「アップキャストとダウンキャスト」について解説します。


🤔 アップキャストとは

👉 子クラスのオブジェクトを、親クラス型として扱うこと

たとえば

Animal a = new Dog();

実体はdogですが、変数の型はAnimalになっています。


💻 サンプルコード(アップキャスト)

今回も犬のクラス構造を使って解説します。

class Animal {}
class Dog extends Animal {}

interface Trick {}
class TalentDog implements Trick {}

public class Main {
    static Dog getDog() { return new Dog(); }              
    static void showAnimal(Animal animal) {}               
    static Trick getTrickDog() { return new TalentDog(); } 
    static void showTrick(Trick trick) {}                  

    public static void main(String[] args) {
        Animal a1 = new Dog();          // 代入
        Animal a2 = getDog();           // 戻り値
        showAnimal(new Dog());          // 引数

        Trick t1 = new TalentDog();     
        Trick t2 = getTrickDog();       
        showTrick(new TalentDog());     
    }
}

このコードでは、

  • 代入
  • 戻り値
  • 引数

の3パターンでアップキャストを確認しています。

👉 アップキャストは 自動で行われるため、安全です。


🤔 ダウンキャストとは

👉 親クラス型の参照を、子クラス型として扱い直すことです。


💻 サンプルコード(ダウンキャスト)

こちらも犬のクラス構造で見てみましょう。

class Animal {}

class Dog extends Animal {
    void bark() {
        System.out.println("Woof!");
    }
}

class Puppy extends Dog {
    void play() {
        System.out.println("Playing!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Puppy();   // アップキャスト
        Dog dog = (Dog) animal1;        // ダウンキャスト成功
        dog.bark();

        Animal animal2 = new Dog();     // アップキャスト
        Puppy puppy = (Puppy) animal2;  // ダウンキャスト失敗(ここでClassCastException)
        puppy.play();
    }
}

⚖️ 成功例と失敗例

✅ 成功するケース

Animal a = new Puppy();
Dog d = (Dog) a; // OK

👉 実体がPuppy(=Dogの子)なので成功します。

❌ 失敗するケース

Animal a = new Dog();
Puppy p = (Puppy) a; // ClassCastException

👉 実体がDogなので、Puppyとして扱うことはできません。


🐶 図で理解する

クラス関係を図で見ると

クラス関係

Animal
 └ Dog(実体)
  └ Puppy(ここにいない)
  

👉 DogPuppyとして扱うことはできません


🔍 アップキャストとダウンキャストの違い

項目 アップキャスト ダウンキャスト
方向 子 → 親 親 → 子
安全性 安全 危険
キャスト 不要 必要

✍️ まとめ

  • アップキャストは安全(自動で行われる)
  • ダウンキャストは注意が必要(実体が重要)
  • キャストは「型」ではなく「実体」を意識することが大切

📝 最後に

キャストは「変身」ではなく「見方を変えるだけ」です。

だからこそ、実体が何かを常に意識することが重要です。

Java学習中の方の参考になれば幸いです🙌


【プロフィール・作品置き場】

kenichikamoi.com


🎵 Youtube(楽曲一覧)はこちら

www.youtube.com