【Java入門】superとは?superの意味と使い方を解説!

書いた人 ヤマシタ
侍エンジニア塾ブログは、未経験からWebアプリ開発と仕事獲得をサポートする
侍エンジニア塾のオウンドメディアです。
プログラミング学習を覗き見

こんにちは!フリーエンジニアの山下です。

Java親クラスの変数やメソッドに子クラスからアクセスしたいと思ったことはありませんか?

そんなときは、「super」を使えば子クラスから親クラスの変数やメソッドを参照することができます!

この記事では、

・superとは
・superの使い方
・superとthisとの違い

という基本的な内容から、

・superで親クラスのコンストラクタを呼び出す方法
・superで親クラスの変数やメソッドを参照する方法
・cloneのsuperとは
・generics(ジェネリクス)のsuperとは

などの応用的な内容についても解説していきます。

今回はJavaのsuperについて、使い方をわかりやすく解説します!

superとは

superとは、Javaにおけるサブクラスでオーバーライド(親クラスのメソッドを子クラスで継承)された変数やインスタンスを参照する場合に使用されます。

つまり、子クラスのインスタンス(new [クラス名()]で作られたクラスの実体のこと)から、親クラスのインスタンスのメンバにアクセスして、値を参照する必要があるときにsuperが使用されます。

superでアクセスできるのは、1世代上の親クラスになるので、2回以上継承を繰り返すときには注意して使ってください。

superの使い方

ここでは、superを理解するのに必須のクラスの継承から、superの基本的な使い方を説明します。

クラスの継承の復習

superの使い方に入る前に、extends(継承)の使い方についても触れておきましょう。

クラスの継承とは、例えばクラスFruitClassがあったとして、そのFruitClassを継承したAppleClassを作るとします。

クラスの継承するときは「extends クラス名」で指定します。

クラスを継承することで、FruitClassは親クラスとなり、AppleClassは子クラスとなります。

つまり、親クラスを継承することで、子クラスであるAppleClassからは、親クラスのインスタンスや変数にアクセスすることが可能になります。

以下に実際にクラスの継承を使用したサンプルを記述します。

[実行結果]

サンプルでは、親クラスであるFruitClassと親クラスを継承した子クラスであるAppleClass、さらにAppleClassを継承したApplePieClassクラスがあります。

MainメソッドからApplePieClassのインスタンスを作成すると、継承元の親クラスであるAppleClassクラスと、さらにその親クラスであるFruitClassが参照されます。

つまり、一番上層の親クラスから順に参照されるため、実行結果のように出力されます。

クラスの継承についてはこちらの記事で解説しているので、ぜひ確認してください!

superで親クラスのコンストラクタを呼び出す方法

前述したクラスの継承を踏まえて、superの基本的な使い方を見ていきましょう。

以下に子クラスから親クラスをsuperで呼び出して、実行結果を出力するサンプルを記述します。

[実行結果]

サンプルでは親クラスであるSuperClassと子クラスであるSubClassを作成し、extendsでSuperClassを継承しています。

Subクラスのコンストラクタから、superを使用して引数で文字列”apple”を指定しています。

親クラスには3つの引数の異なる(引数なし、String型、int型)コンストラクタがありますが、子クラスではsuperで文字列の引数を指定しているため、該当するString型の引数があるコンストラクタが呼び出されています。

int型のコンストラクタを呼び出したい場合は、super(int型)を指定します。

superで親クラス(スーパークラス)の変数やメソッドを参照

ここでは、superで親クラス(スーパークラス)の変数やメソッドを参照する方法を解説します。

子クラス(サブクラス)で、オーバーライドを行った場合にはメソッド名が同じになるので、そのままでは親クラスのメソッドを呼び出すことができません。

このときに、superを使って親クラスのオーバーライドされていないメソッドを呼び出すことができます。

同様に、superを使って同じ変数名の隠蔽された親クラスの変数を参照することができます。

次のプログラムで確認してみましょう。

[実行結果]

このプログラムの実行結果から、superを使うと親クラスの変数の値が表示され、superを使わない場合には子クラスの値が表示されることが確認できます。

同様に、superを使うと親クラスのメソッドが呼び出され、superを使わない場合には子クラスのメソッドが呼び出されることが確認できます。

このようにsuperを使うことで、オーバーライドした場合にも親クラスのメソッドや、隠蔽された変数を参照できることが確認できました!

superとthisの違いと使い方

superは親クラスの変数やコンストラクタにアクセスできるのに対して、this自分のクラスの変数やメソッドにアクセスするために使用します。

以下にsuperとthisの違いがわかるサンプルを記述します。

[実行結果]

実行結果からわかるようにsuperを指定すると親クラスの変数を、thisを使用すると自分のクラスの変数を参照していることがわかります。

thisの使い方については、以下の記事で詳しく解説しています!

応用的な使い方

cloneのsuperとは

Javaの全ての親クラスには、オブジェクトを複製するためのcloneメソッドが用意されています。

cloneメソッドを使用することにより、自分自身のクラスを複製することができます。

例えば、片方のクラスを操作して変数の内容が変わっても、cloneメソッドを使用してクラスの複製を作っておけば、もう1つのクラスは内容が変わることがありません。

cloneメソッドを使用するには、Cloneableインターフェース(implements)を実装する必要があります。

Cloneableインターフェースを実装する際に、クラスのフィールドに普遍オブジェクトがある場合は、cloneメソッドの中身はsuper.clone()を呼び出します。

以下にcloneメソッドを使用した簡単な使用例を記述します。

[実行結果]

サンプルではClone_Testの複製を作成し、その後変数numの値を変更しています。

実行結果からわかるように、cloneメソッドで複製したClone_Testクラスのctが参照している、変数numの値が変わっていないことがわかります。

generics(ジェネリクス)のsuperとは

generics(ジェネリクス)とはクラスを作るときに、型の情報を変数として、汎用的に保持するためのJavaSE 6から登場した機能です。

superをgenericsとして指定する場合は「? super Integer」のように指定してあげれば、下限型つきのスーパータイプとなります。

この例では、クラスの上層への型指定となります。

genericsは、扱い方が難しく初心者には不向きと言えます。

generics(ジェネリクス)についてはこちらの記事で詳しく解説しているので、ぜひ確認してください。

まとめ

ここでは、Javaにおけるsuperの役割や使い方などを説明しました。

superは、親クラスのインスタンスや変数を参照するのに便利ですので、ぜひ覚えておきましょう。

もし、superの使い方を忘れてしまったら、この記事を思い出してくださいね!

Javaカリキュラム無料公開中!
この記事はJava入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Java学習に必要な情報を一つにまとめていますので効率よくJavaを学ぶことが出来ます。この機会に是非活用していただければと思います。


33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーランスをされている市川友哉さん。33歳で、プログラミングを学び始め、4ヶ月という短い期間でフリーランスエンジニアとして独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。


最短でJavaを習得したい方へ

もし、あなたが、

「難しすぎて学習が全然進まない」
「学習量が膨大でゴールが見えない」
「エラーを解決するのに何日もかかってしまう」

など、プログラミング学習やキャリアに関してお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_bannar-java1

非常識な結果を出した卒業生

活躍する現役エンジニア

人気記事セレクション

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

ヤマシタ

フリーランスエンジニア。ITに関わるさまざまなコンテンツの企画・制作も行っています。
ITに関してはノウハウ系、ライフハック系、トレンド系など、今まで200本以上の執筆経験があります