teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追加

2016/06/13 18:58

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,1 +1,17 @@
1
- 三行目はコンストラクタです。Plantクラスのオブジェクトを作成する際の初期化の手続きを書いています。
1
+ 三行目はコンストラクタです。Plantクラスのオブジェクトを作成する際の初期化の手続きを書いています。
2
+
3
+ ---
4
+
5
+ これでベストアンサーってのも格好がつかないので補足を。
6
+ なぜ`public Plant(){this("fern");}`をPlantクラスに入れる必要があるのか
7
+ ---
8
+ Plantクラスを継承したTreeクラスではコンストラクタがありません。この時、自動で引数なしのコンストラクタが作られます。コンストラクタの最初に`super()`や`this()`のような明示的なコンストラクタ呼び出し(後述)がない場合、親クラスの引数なしのコンストラクタが最初に呼び出されます。しかし親クラスのPlantクラスに引数なしのコンストラクタが存在しないため、このままではエラーになります。そのため、
9
+ 1. Plantクラスに引数なしのコンストラクタを追加する
10
+ 2. Treeクラスでコンストラクタを宣言し、その最初で`super("適当なString")`を呼び出す
11
+
12
+ のいずれかが必要になります。他の選択肢はわかりませんが、エラーにならないよう追加するコードがそれになります。
13
+
14
+ コンストラクタ呼び出し
15
+ ---
16
+
17
+ 初期化処理で他の初期化手続きを使いたい、親クラスの初期化でこの手順を使いたい、といった場合に使えます。今回の`this("fern")`は、このクラス(Plant)のコンストラクタを使って、引数に"fern"を渡して初期化する、という事になります。