rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

kotlinでのクラス。コンストラクタ,init{}初期化処理,継承サブクラスでのコンストラクタ実行

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")
    }

}