Kotlinの一次および二次コンストラクターの理解

Kotlinに遭遇:プライマリコンストラクターが予期されるエラーを呼び出す

 

クラスに1次コンストラクターがある場合、各2次コンストラクターを1次コンストラクターに委任する必要があります。これは、他の2次コンストラクターを介して直接委任または間接的に委任できます。この キーワードを使用し、同じクラスの別のコンストラクター委任します 

この文は、クラスにプライマリコンストラクタがある場合、プライマリコンストラクタに加えて他のセカンダリコンストラクタがある限り、これらのセカンダリコンストラクタはさまざまな方法でプライマリコンストラクタを呼び出す必要があることを意味します。

方法1:各2次コンストラクターは1次コンストラクターを呼び出します   直接委任

class Parent(name: String) {

    var age = 0;
    var sex = "man"

    constructor(name: String, age: Int) : this("Main name 1") {
        this.age = age;
        println("constructor 1 $name , $age , $sex")
    }

    constructor(nickName: String, sex: String) : this("Main name 2") {

        this.sex = sex;
        println("constructor 2 $nickName , $age , $sex")
    }

    open fun learn() {
        println(" learn ")
    }
}

fun main() {
    Parent("lucy", "woman").learn()
}

上記のコードのように、各コンストラクターの後、メインコンストラクターはthis( "name")と呼ばれます。

方法2:2次コンストラクター2 ————> 2次コンストラクター1、および2次コンストラクター1 ————> 1次コンストラクター 間接委任

最終:セカンダリコンストラクタ2-間接->プライマリコンストラクタ  

したがって、セカンダリコンストラクター->セカンダリコンストラクター->セカンダリコンストラクターがいくつ呼び出されても、最終的にはプライマリコンストラクターを呼び出すセカンダリコンストラクターが存在する必要があります。そうでない場合、エラーが報告されます。

次のコード:constructor(nickName:String、sex:String)->コンストラクター(name:String、age:Int)->メインコンストラクターthis( "Main name 1")

class Parent(name: String) {

    var age = 0;
    var sex = "man"
    
    //次级构造函数1
    constructor(name: String, age: Int) : this("Main name 1") {
        this.age = age;
        println("constructor 1 $name , $age , $sex")
    }

    //次级构造函数2
    constructor(nickName: String, sex: String) : this("nickName jj", 12) {

        this.sex = sex;
        println("constructor 2 $nickName , $age , $sex")
    }

    open fun learn() {
        println(" learn ")
    }
}

fun main() {
    Parent("lucy", "woman").learn()
}

 

 

クラスにプライマリコンストラクタがない場合、セカンダリコンストラクタはプライマリコンストラクタを明示的に呼び出す必要はありません。

class Parent {

    init {
         // 初始化代码块本质就是主构造函数的方法体
         // 因为主构造函数在类名头部声明不能带有方法体
          
        println("Main constructor")
    }

    constructor(sex: String) {
        println("constructor  , $sex")
    }

    open fun learn() {
        println(" learn ")
    }
}

fun main() {
    Parent("woman").learn()
}

ログを印刷する
 

メインコンストラクターを宣言していませんが、パラメーターなしで生成されたメインコンストラクターが生成されます。二次コンストラクターを呼び出すときに暗黙的に呼び出されます。

つまり、コードに記述する必要はありませんが、セカンダリコンストラクターを呼び出す前に呼び出されます。

ログに 

メイン関数メソッド本体のメインコンストラクターが最初に出力され、次にセカンダリコンストラクターのコンストラクターと女性が出力されます

main()メソッドのセカンダリコンストラクタを介してPersonクラスオブジェクトを初期化しますが、セカンダリコンストラクタの前にデフォルトの引数のないプライマリコンストラクタを暗黙的に呼び出します。

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/u011288271/article/details/106546490