回答編集履歴

1

追記

2019/02/13 15:29

投稿

rubytomato
rubytomato

スコア1752

test CHANGED
@@ -147,3 +147,155 @@
147
147
  }
148
148
 
149
149
  ```
150
+
151
+
152
+
153
+ **2019/02/14追記**
154
+
155
+
156
+
157
+ 下記のコードは、回答欄に記述したクラスのプライマリコンストラクタを少し修正したものです。
158
+
159
+
160
+
161
+ ```
162
+
163
+ class Person constructor(name: String) {
164
+
165
+ // このブロック内のコードがプライマリコンストラクタ呼び出し時に実行される
166
+
167
+ val name: String = name //コンストラクタの引数でプロパティを初期化
168
+
169
+ var age: Int = 0 // デフォルト値で初期化
170
+
171
+ val children= mutableListOf<Person>() // 同上
172
+
173
+
174
+
175
+ // init blockはそのあとに実行される
176
+
177
+ init {
178
+
179
+ println("Init Block. name=${this.name} age=${this.age} children=${this.children.size}")
180
+
181
+ }
182
+
183
+
184
+
185
+ }
186
+
187
+ ```
188
+
189
+
190
+
191
+ さらに、initブロックが記述されていればプリライマリコンストラクタの実行後に実行されます。
192
+
193
+
194
+
195
+ この時点で処理の順番はインスタンス生成 → プライマリコンストラクタ → initブロック → セカンダリコンストラクタになります。
196
+
197
+
198
+
199
+ 試しにinitブロックやコンストラクタ内にprint文を入れて実行してみると次のようになります。
200
+
201
+
202
+
203
+ ```kotlin
204
+
205
+ class Person constructor(name: String) {
206
+
207
+ val name: String = name
208
+
209
+ var age: Int = 0
210
+
211
+ val children= mutableListOf<Person>()
212
+
213
+
214
+
215
+ // Init Block
216
+
217
+ init {
218
+
219
+ println("Init Block. name=${this.name} age=${this.age} children=${this.children.size}")
220
+
221
+ }
222
+
223
+
224
+
225
+ // Secondary constructor (A)
226
+
227
+ constructor(name: String, age: Int, person: Person) : this(name) {
228
+
229
+ println("constructor A. age=${this.age} children=${this.children.size}")
230
+
231
+ person.children.add(this)
232
+
233
+ this.age = age
234
+
235
+ }
236
+
237
+ // Secondary constructor (B)
238
+
239
+ constructor(name: String, person: Person) : this(name, 0, person) {
240
+
241
+ println("constructor B. age=${this.age} children=${this.children.size}")
242
+
243
+ }
244
+
245
+
246
+
247
+ override fun toString(): String {
248
+
249
+ return "Person(name='$name', age=$age, children=$children)"
250
+
251
+ }
252
+
253
+
254
+
255
+ }
256
+
257
+ ```
258
+
259
+
260
+
261
+ 実行してみます。
262
+
263
+
264
+
265
+ ```kotlin
266
+
267
+ val father = Person("父")
268
+
269
+ // Init Block. name=父 age=0 children=0
270
+
271
+ println(father)
272
+
273
+ // Person(name='父', age=0, children=[])
274
+
275
+
276
+
277
+ val son = Person("息子", 5, father)
278
+
279
+ // Init Block. name=息子 age=0 children=0
280
+
281
+ // constructor A. age=0 children=0
282
+
283
+ println(son)
284
+
285
+ // Person(name='息子', age=5, children=[])
286
+
287
+
288
+
289
+ val daughter = Person("娘", father)
290
+
291
+ // Init Block. name=娘 age=0 children=0
292
+
293
+ // constructor A. age=0 children=0
294
+
295
+ // constructor B. age=0 children=0
296
+
297
+ println(daughter)
298
+
299
+ // Person(name='娘', age=0, children=[])
300
+
301
+ ```