支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


Javaのsuperとは?

Javaにはsuperというものがあります。

superはサブクラスからスーパークラスの変数やメソッドを参照し呼び出すことができます

ここではJavaのsuperについて説明します。

Javaでsuperを使用しメソッドを呼び出す

Javaではサブクラスから明示的にスーパークラスのメソッドを呼び出す場合は以下のコードを使用します。

super.メソッド名()

これはメソッドをオーバーライドしてる場合、明示的にスーパークラスのメソッドを使用したい時に使います。

実際のサンプルコード

class Super{
	String str;
	public void methodA(){System.out.println("スーパークラスのメソッドが呼び出されました");}

}

class Sub extends Super{ //①
	public void methodA(){System.out.println("サブクラスのメソッドが呼び出されました");}//②
	public void methodB(){
		methodA(); //③
		super.methodA();//④
	}
}

public class Sample {
    public static void main(String[] args) {
        Sub sub = new Sub();//⑤
        sub.methodB();
    }
}
実行結果

サブクラスのメソッドが呼び出されました
スーパークラスのメソッドが呼び出されました

サンプルコードの説明を行います。

①はSuperを継承したSubを作成しています。

②はスーパークラスのSuperのmethodA()をオーバライドしています。

③はサブクラスのmethodA()の呼び出し、④はスーパークラスのmethodA()を呼び出しています。

⑤でSubのインスタンス化を行いsub.methodB();でmethodBを呼び出しています。

そのため実行結果が表示されます。

Javaでsuperを使用しコンストラクタを呼び出す

superを使用せずにコンストラクタを呼び出した場合

次のサンプルコードを見てください。

class Super{
	public Super(){System.out.println("Superのコンストラクタが呼び出されました");}
	public Super(String a){System.out.println("Super:"+a);}
}

class Sub extends Super{
	public Sub(){System.out.println("Subのコンストラクタが呼び出されました");}
	public Sub(String a){System.out.println("Sub:"+a);}
}

public class Sample {
    public static void main(String[] args) {
        Sub sub1 = new Sub();
        Sub sub2 = new Sub("こんにちは");
    }
}
実行結果

Superのコンストラクタが呼び出されました
Subのコンストラクタが呼び出されました
Superのコンストラクタが呼び出されました
Sub:こんにちは

このコードではクラス名SubのSub()とSub(String a)の呼び出しのみを行っていますが、スーパークラスのコンストラクタが先に呼び出されています。

これはJavaでは継承関係のあるクラスをインスタンス化すると、先にスーパークラスのコンストラクタが実行されてしまうためです。またSub(String a)を呼び出すと、引数を持たないSuper()が実行されていて引数を持つSuper(String a)が実行されていません。これは、明示的に指定していないと、引数を持たないスーパークラスのコンストラクタSuper()が呼び出される仕組みになっているためです

明示的に指定するにはsuperを使用します。

superを使用してコンストラクタを呼び出す

superを使用し明示的に指定した場合どうなるかを説明します。

サンプルコード

class Super{
	public Super(){System.out.println("Superのコンストラクタが呼び出されました");}
	public Super(String a){System.out.println("Super:"+a);}
}

class Sub extends Super{
	public Sub(){System.out.println("Subのコンストラクタが呼び出されました");}
	public Sub(String a){
		super(a);
		System.out.println("Sub:"+a);}
}

public class Sample {
    public static void main(String[] args) {
        Sub sub1 = new Sub();
        Sub sub2 = new Sub("こんにちは");
    }
}
実行結果

Superのコンストラクタが呼び出されました
Subのコンストラクタが呼び出されました
Super:こんにちは
Sub:こんにちは

先ほどのsuperを使用せずにコンストラクタを呼び出すで紹介したサンプルコードのSub(String a)の処理内容にsuperを使用して明示的に記述しました。そのため、Super(String a)が呼び出され実行結果が表示されています。

superを記述する場所はコンストラクタ定義の先頭に記述しなければならないため注意が必要です

Javaではsuper()を使用することでインスタンス化時の初期化処理を柔軟に行うことが出来ます。

スーパークラスの変数にアクセスする

Javaではsuperを使用することでサブクラスからスーパークラスの変数にアクセスすることができます。

基本構文は以下のコードとなります。

super.変数

サンプルコード

class Super{
	String str = "Superの文字列";//①
}

class Sub extends Super{
	String str ="Subの文字列";//②
	public void str(){
		System.out.println("super.str : " + super.str);//③
        System.out.println("this.str : " + this.str);//④
	}
}


public class Sample {
    public static void main(String[] args) {
         Sub sub = new Sub();
         sub.str();
}
実行結果

super.str : Superの文字列
this.str : Subの文字列

サンプルコードの説明をします。

①ではスーパークラスで文字列を作成しています。

②ではサブクラスで文字列を作成しています。

③はsuperを使用しスーパークラスのstrを出力、④はthisを使用しサブクラスのstrを出力します。

thisはこのオブジェクトが持つを意味しています。

その後str()メソッドを使用し③、④を出力しているため、実行結果が表示されます。

まとめ

Javaのsuperについて説明しました。

superはサブクラスからスーパークラスのメソッドや変数などにアクセスできるものとなっています。