kayano_devのブログ

技術関連の勉強記録用ブログ

【Java】superとsuper()

はじめに

Javaのクラス継承について学習する中で出てきた「super」と「super()」。
この二つが結構ごちゃごちゃになってしまう。
あと、「超」とか「すごい」ってイメージしてしまう英単語で名づけられてるので混乱する。
スーパークラスって単語見るたび「すごいクラス」とか何…?ってなる。
ということで理解を深めるために色々まとめてみる。

英単語としてのsuper

本題へ入る前に、モヤモヤを解消するためとりあえずまずは英単語としての意味をググってみた。
その結果、「超」とか「すごい」を意味するのは形容詞としての「super」であり、「スーパークラス」で使われている「super」はどうやら以下のことを意味していることが分かった。

接頭辞「上」,「超越」,「過度」などの意を表す1

スーパークラス」、「上のクラス」って意味なら結構しっくりくる。
ちなみにこの場合の「super」の対義語は「sub」で、「サブクラス」も「副次的なクラス」って意味ではなく「下のクラス」って意味合いになるっぽい。なるほど。

superとは

ここでようやく本題へ。
『スッキリわかるJava入門 第3版』387ページによると、

superとは、「今より1つ内側のインスタンス部分」を表す予約語です。

ということらしい。
インスタンスのフィールドを使う時は「super.フィールド名」、メソッドを使う時は「super.メソッド名(引数)」のように記述する。
オーバーライドしたメソッドと、オーバーライドする前のメソッドをどちらも使いたい時とかに書けそう。
これ単体であればわりと理解しやすい概念な気がする。

super()とは

一方こちらは親クラスのコンストラクタを呼び出す際に使用するもの。
引数を渡す場合は「super(引数)」のように記述する。
この「super()」、「super.メンバ」みたいに親クラスの物と子クラスでオーバーライドした物とどちらも使いたいときに書くものかと思っていたら、違った。
Javaにおいて全てのコンストラクタは先頭で必ず親クラスのコンストラクタを呼び出さなければならず、もしコンストラクタの1行目に「super()」が記述されていない場合、コンパイラによって「super()」が自動的に挿入されるとのこと。
つまり、親クラスに引数ありのコンストラクタがある場合、子クラスを作るときに必ず「super(引数)」を記述してやらないとエラーになってしまう。

おわりに

superとsuper()では使う時の感覚が結構異なることが分かった。
まだJavaでオリジナルの何かを作るって段階ではないんだけれども、先々このあたりでつまづきそうな気がしたので、今のうちに少しでもモヤモヤ感を解消できたので良かった。

参考にしたもの

ejje.weblio.jp book.impress.co.jp


  1. 引用:Weblio (情報提供元 Eゲイト英和辞典)