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を書く方には「当然のこと!」と怒られそうですが、、、