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

【Java】サブクラス変数をスーパークラス型に変換する方法を徹底解説


継承とは

継承(インヘリタンス)とは、あるクラスが別のクラスのプロパティ(メンバー)を受け継ぐ、2つのクラス間の関係です。Javaでは extends キーワードを使って、次のように定義します。

public class A extends B{
}

プロパティを受け継ぐ側のクラスを「サブクラス(子クラス)」、受け継がれる側のクラスを「スーパークラス(親クラス)」と呼びます。

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

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

サブクラスの変数(オブジェクト)は、スーパークラス型の変数に直接代入できます。言い換えると、スーパークラスの参照変数はサブクラスのオブジェクトを保持できるということです。

ただし、この参照変数を通じてアクセスできるのはスーパークラスのメンバーのみです。サブクラス独自のメンバーにアクセスしようとすると、コンパイル時エラーが発生します。

例1:サブクラスのオブジェクトをスーパークラス型の変数に代入する

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 Person("Krishna", 20);
        // サブクラスのオブジェクトをスーパークラス型の変数に代入
        Sample sample = new Sample("Krishna", 20, "IT", 1256);
        person = sample;
        person.displayPerson();
    }
}

この例では、Sample 型のオブジェクト sample を、Person 型の変数 person に代入しています。これにより、サブクラスのオブジェクトがスーパークラス型として扱われます(アップキャスト)。

出力結果

Personクラスのデータ:
名前:Krishna
年齢:20

注意:サブクラスのメンバーにはアクセスできない

上記の状態で person.displayStudent() のようにサブクラスのメソッドを呼び出そうとすると、次のようなコンパイルエラーになります。

エラー: シンボルを見つけられません
  シンボル:   メソッド displayStudent()
  場所: タイプPersonの変数 person

これは、スーパークラス型の参照変数が「参照できる」のはスーパークラスで宣言されたメンバーだけだからです。サブクラスのメンバーにアクセスしたい場合は、明示的なダウンキャストが必要になります。

例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 obj = new Test();
        obj.superMethod();
    }
}

「Super obj = new Test();」のように、スーパークラス型の変数でサブクラスのインスタンスを生成することもできます。この場合も、obj から呼び出せるのはスーパークラスで定義されたメソッドのみです。

出力結果

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

出力を見ると、まずスーパークラスのコンストラクタが実行され、その後にサブクラスのコンストラクタが実行されていることが分かります。これは、サブクラスのインスタンス生成時に、暗黙的にスーパークラスのコンストラクタが先に呼び出されるためです。

まとめ

  • サブクラスのオブジェクトは、スーパークラス型の変数に直接代入できる(アップキャスト)。
  • スーパークラス型の参照変数からアクセスできるのは、スーパークラスのメンバーのみ。
  • サブクラス独自のメンバーにアクセスしようとすると、コンパイルエラーが発生する。
  • サブクラスのメンバーが必要な場合は、ダウンキャスト(明示的な型変換)を行う必要がある。
  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といったコレクションにプリミティブ型の値を格納できるようになります。また