Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでスーパークラスの参照変数をサブクラス型にキャストする方法を解説

継承とは

継承(Inheritance)とは、あるクラスが別のクラスの性質(フィールドやメソッド)を受け継ぐ、2つのクラス間の関係です。この関係は extends キーワードを使って次のように定義します。

public class A extends B{
}

このとき、性質を受け継ぐ側のクラスをサブクラス(子クラス)、受け継がれる側のクラスをスーパークラス(親クラス)と呼びます。

継承では、スーパークラスのメンバーのコピーがサブクラスのオブジェクト内に作られます。そのため、サブクラスのオブジェクトを使えば、両方のクラスのメンバーにアクセスすることができます。

スーパークラスの参照変数をサブクラス型に変換する方法

スーパークラス型の変数をサブクラス型に変換するには、単純にキャスト演算子を使用します。ただし、重要な前提条件があります。まずサブクラスのオブジェクトを使ってスーパークラス型の参照を作成し、その後、その(スーパー)参照をキャスト演算子によってサブクラス型へ変換する必要があります。

つまり、実際のオブジェクトがサブクラスのインスタンスである場合にのみ、ダウンキャストは成功します。もし実際のオブジェクトがスーパークラスそのものであれば、実行時に ClassCastException がスローされるため注意が必要です。安全にキャストするには、事前に instanceof 演算子で型を確認することをおすすめします。

例1:PersonクラスとSampleクラスの場合

class Person{
   public String name;
   public int age;
   public Person(String name, int age){
      this.name = name;
      this.age = age;
   }
   public void displayPerson() {
      System.out.println("Personクラスのデータ: ");
      System.out.println("名前: "+this.name);
      System.out.println("年齢: "+this.age);
   }
}
public class Sample extends Person {
   public String branch;
   public int Student_id;

   public Sample(String name, int age, String branch, int Student_id){
   super(name, age);
      this.branch = branch;
      this.Student_id = Student_id;
   }
   public void displayStudent() {
      System.out.println("Studentクラスのデータ: ");
      System.out.println("名前: "+super.name);
      System.out.println("年齢: "+super.age);
      System.out.println("学科: "+this.branch);
      System.out.println("学籍番号: "+this.Student_id);
   }
   public static void main(String[] args) {       
      Person person = new Sample("Krishna", 20, "IT", 1256);     
      // スーパークラス変数をサブクラス型に変換
      Sample obj = (Sample) person;     
      obj.displayPerson();
      obj.displayStudent();
   }
}

実行結果

Personクラスのデータ:
名前: Krishna
年齢: 20
Studentクラスのデータ:
名前: Krishna
年齢: 20
学科: IT
学籍番号: 1256

この例では、new Sample(...) で生成したオブジェクトをスーパークラス型の変数 person に代入しています。その後、(Sample) person とキャストすることで、サブクラス独自のメソッド displayStudent() も呼び出せるようになります。

例2:コンストラクタとメソッドの動作確認

class Super{
   public Super(){
      System.out.println("スーパークラスのコンストラクタ");
   }
   public void superMethod() {
      System.out.println("スーパークラスのメソッド");
   }
}
public class Test extends Super {
   public Test(){
      System.out.println("サブクラスのコンストラクタ");
   }
   public void subMethod() {
      System.out.println("サブクラスのメソッド");
   }
   public static void main(String[] args) {       
      Super sup = new Test();     
      // スーパークラス変数をサブクラス型に変換
      Test obj = (Test) sup;     
      obj.superMethod();
      obj.subMethod();
   }
}

実行結果

スーパークラスのコンストラクタ
サブクラスのコンストラクタ
スーパークラスのメソッド
サブクラスのメソッド

この例からも分かるように、Super sup = new Test() の時点でスーパークラスとサブクラス両方のコンストラクタが順に実行され、キャスト後のオブジェクトからは両クラスのメソッドを自由に呼び出せることが確認できます。

まとめ

  • スーパークラス型の変数をサブクラス型に変換するには、キャスト演算子 (サブクラス名) を使用します。
  • キャスト元の参照が、実際にはサブクラスのオブジェクトを指している必要があります。
  • 無関係な型への無理なダウンキャストは ClassCastException を引き起こすため、instanceof による事前チェックが推奨されます。
  1. Javaでformatメソッドを使ってdouble値を文字列に変換する方法

    format()メソッドとはString.format()メソッドは、書式指定文字列と可変長引数(varargs)を受け取り、指定された書式に従って整形された新しい文字列オブジェクトを返すメソッドです。double型の値を文字列に変換したい場合も、このformat()メソッドが利用できます。書式指定文字列として"%f"を渡し、第2引数に変換対象のdouble値を指定するだけでOKです。例1:ユーザー入力したdouble値を変換するScannerクラスでキーボードから入力を受け付け、そのdouble値を文字列に変換するサンプルです。import java.util.Scann

  2. Javaのラッパークラスでプリミティブ型を変換する方法とディレクトリ操作の基本

    本記事では、Javaのラッパークラスの基本的な使い方と、java.nioパッケージのFilesクラスを利用したディレクトリの作成・一覧表示・フィルタリングの方法について、サンプルコード付きで解説します。 ラッパークラスとは Javaには、java.langパッケージに「ラッパークラス」と呼ばれるクラス群が用意されています。これらのクラスのオブジェクトは、intやcharなどのプリミティブ型(基本データ型)の値を内部に包み込む(ラップする)役割を果たします。 ラッパークラスを利用することで、ArrayListやHashMapといったコレクションにプリミティブ型の値を格納できるようになります。また