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

Javaのthisとsuperの違いを徹底解説!比較表とサンプルコードで学ぶ正しい使い分け

Javaには、現在のクラスのインスタンスを表すthisと、親クラス(スーパークラス)を表すsuperという2つの特別なキーワードが用意されています。どちらもインスタンスに紐づくキーワードである点では共通していますが、その役割や利用できる場面には大きな違いがあります。本記事では、比較表と実際に動作するサンプルコードを通して、両者の違いをわかりやすく解説します。

thisとsuperの主な違い

No.比較項目thissuper
1表す対象現在のクラス(自分自身)のインスタンスへの参照を表します。親クラス(スーパークラス)側のインスタンス部分への参照を表します。
2コンストラクタとの関係this(...) の形式で、同じクラス内の別のコンストラクタを呼び出せます。super(...) の形式で、親クラスのコンストラクタを呼び出せます。
3メンバーへのアクセス現在のクラスのフィールドやメソッドにアクセスする際に使います。親クラスのフィールドやメソッド(オーバーライドされる前の実装など)にアクセスする際に使います。
4静的コンテキストでの利用staticメソッドやstaticブロックの中では参照できません。誤って使用するとコンパイルエラーになります。こちらもstaticコンテキストからは参照できず、使用するとコンパイルエラーとなります。

コンストラクタ呼び出し時のルール

this(...) と super(...) をコンストラクタ内で使う場合は、次のルールに注意しましょう。

  • 必ずコンストラクタの先頭の文として記述する必要があります。
  • 1つのコンストラクタ内で this(...) と super(...) を同時に指定することはできません
  • 明示的に記述しなかった場合、コンパイラが自動的に引数なしの super() を先頭に挿入します。

thisとsuperの動作を確認するサンプルコード

Point.java

class A {
    public int x, y;

    public A(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

class B extends A {
    public int x, y;

    public B() {
        this(0, 0); // 同じクラスの別のコンストラクタを呼び出す
    }

    public B(int x, int y) {
        super(x + 1, y + 1); // 親クラスのコンストラクタを呼び出す
        this.x = x;
        this.y = y;
    }

    public void print() {
        System.out.println("Base class : {" + x + ", " + y + "}");
        System.out.println("Super class : {" + super.x + ", " + super.y + "}");
    }
}

public class Point {
    public static void main(String[] args) {
        B obj = new B();
        obj.print();

        obj = new B(1, 2);
        obj.print();
    }
}

実行結果

Base class : {0, 0}
Super class : {1, 1}

Base class : {1, 2}
Super class : {2, 3}

サンプルコードの解説

子クラスBのコンストラクタ B(int x, int y) では、まず super(x + 1, y + 1) によって親クラスAのコンストラクタが呼び出されます。その結果、親クラス側のフィールド x と y には「渡された値に1を加えたもの」が代入されます。続く this.x = x; と this.y = y; では、子クラスB自身のフィールドに引数の値を代入しています。

print() メソッド内では、単に x と y と書けば子クラスBのフィールドが、super.x や super.y と書けば親クラスAのフィールドがそれぞれ参照されます。そのため、「Base class」と「Super class」で異なる値が出力されるのです。

このように、this は「今操作しているオブジェクト自身」を、super は「親クラスの要素」を指し示すためのキーワードです。継承関係を持つクラスを設計する際には、両者の役割を正しく理解して使い分けることが非常に重要です。

  1. Javaにおける例外(Exception)とエラー(Error)の違いを徹底解説

    Javaにおいて、例外(Exception)とエラー(Error)はどちらも Throwable クラスのサブクラスです。しかし、両者には明確な違いがあり、堅牢なアプリケーションを開発するうえで、それぞれの特性を正しく理解することは非常に重要です。 エラー(Error)とは エラーは、主にシステムリソースの不足によって発生する深刻な問題を示します。この種の問題はアプリケーション側でキャッチ(捕捉)すべきものではなく、基本的にプログラマーが対処できる範囲を超えています。代表的な例としては、システムクラッシュやメモリ不足(OutOfMemoryError)などが挙げられます。 エラーはほとんどの

  2. Javaにおけるシリアライズ(Serializable)と外部化(Externalizable)の違いを徹底解説

    Javaのシリアライズ(直列化)と外部化(Externalizable)は、どちらもオブジェクトをバイトストリームに変換し、そのバイトストリームをデータベースやメモリに保存するための仕組みです。java.io.Serializableインターフェースを実装したクラスは自動的にシリアライズ可能となります。一方、外部化はアプリケーションの要件に応じてカスタマイズされたシリアライズを行いたい場合に使用され、Externalizableインターフェースはjava.io.Serializableを継承しています。以下の表に、両者の主な違いをまとめました。No.比較項目シリアライズ(Serializabl