LoginSignup
16
12

More than 5 years have passed since last update.

Javaのsuper()を書く場所に注意

Posted at

Javaでサブクラスをつくった場合、特に何か書かなくてもスーパークラスの
引数なしのコンストラクタはコンパイラによって、自動的に挿入されます。

例えば下記のような、RectangleクラスのサブクラスNamedRectangleクラスをつくった場合
NamedRectangle()コンストラクタのところに、スーパークラスのコンストラクタ呼び出しは
書いていません。

class NamedRectangle extends Rectangle {
    String name;
    NamedRectangle() {
        name = "NO NAME";
    }

この場合、コンパイル時にsuper()が自動的に挿入され、下記のように
スーパークラスの引数なしのコンストラクタが呼び出せるようになっています。

class NamedRectangle extends Rectangle {
    String name;
    NamedRectangle() {
        super(); <-これ
        name = "NO NAME";
    }

ではスーパークラスの引数付きのコンストラクタを呼び出す場合はどうでしょうか?
そうです、明示的に書いてやる必要があります。
例えば下記のような感じ

class NamedRectangle extends Rectangle {
    String name;
    NamedRectangle() {
        super(200, 32);
        name = "NO NAME";
    }

大変前置きが長かったですが、このsuper()を書く位置をずらしてコンパイルすると
どうなってしまうでしょうか?

class NamedRectangle extends Rectangle {
    String name;
    NamedRectangle() {
        name = "NO NAME";
        super(200, 32); <-このように一行したに入れる
    }

コンパイルすると、、、

$ javac PlacedRectangle.java
PlacedRectangle.java:12: エラー: superの呼出しはコンストラクタの先頭文である必要があります
        super(width, height);
             ^
エラー1個

superの呼出しはコンストラクタの先頭文である必要がありますと怒られてしまいました。

Javaを書く方には「当然のこと!」と怒られそうですが、、、

16
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
12