2020 Jun. 28.
init{}初期化処理はプライマリコンストラクタから呼ばれる。
セカンダリコンストラクタでの初期化処理は initキーワードを使わず,constructor() : this() {}ブロックに記述する。
参考元 https://www.web-knowledge-info.com/posts/kotlin23.html
セカンダリコンストラクタに有り、プライマリコンストラクタには無い引数について、その値を保持する変数(プロパティ)はクラス定義ブロックの冒頭に宣言しておく。
サブクラスのプライマリコンストラクタ内ではinit{}を書いていなくても,プライマリコンストラクタのinit{}が自動的に実行される。
セカンダリコンストラクタでプライマリコンストラクタを呼ばないとエラーとなる。
実行順は プライマリコンストラクタ -> init{} -> セカンダリコンストラクタ
init{}は1回だけ必ず呼ばれる。
継承サブクラスのプライマリコンストラクタではスーパークラスのプライマリコンストラクタ,init{}が呼び出される。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.d("MYLOG", "onCreate MainActivity") val myClass = MyClass("abc", 11) myClass.showText() val myClass2 = MyClass2("xyz") myClass2.showText() } } open class MyClass(str:String) { protected var text:String = str protected var num : Int = 0 init { Log.d("MYLOG", "init: $text num = ${num}") } constructor(str: String, num: Int) : this(str) { this.num = num Log.d("MYLOG", "MyClass secondary constructor: $text ${this.num} ") } public open fun showText() { if ( num < 1 ) { Log.d("MYLOG", "showText-Myclass: $text") } else { Log.d("MYLOG", "showText-Myclass: $text : ${num}") } } } class MyClass2( str: String) : MyClass(str) { override fun showText() { Log.d("MYLOG", "showText-Myclass2: $text") } }