English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin コンストラクタ(Constructor)

この記事では、例を通じてKotlinのコンストラクタ(メインコンストラクタとサブコンストラクタ)および初期化プログラムブロックについて説明します。

コンストラクタはクラス属性の初期化を簡潔に行う方法です。

これはオブジェクトのインスタンス化(作成)時に呼び出される特別なメンバーファンクションです。しかし、Kotlinでは少し異なる方法で動作します。

Kotlinでは、2つのコンストラクタがあります:

  • メインコンストラクタ - クラスを初期化する簡潔な方法

  • サブコンストラクタ - 他の初期化ロジックを配置することができます。

メインコンストラクタ

メインコンストラクタはクラスヘッダーの一部です。以下はその例です:

class Person(val firstName: String, var age: Int) {
    // class body
}

括弧で囲まれたコードブロックがメインコンストラクタです:(val firstName: String, var age: Int)

コンストラクタは、firstName(valキーワードで宣言されたため読み取り専用の属性)とage(varキーワードで宣言されたため読み取り書き込み属性)の2つの属性を宣言しています。

例:メインコンストラクタ

fun main(args: Array<String>) {
    val person1 = Person("Joe", 25)
    println("First Name = ${person1.firstName}")
    println("Age = ${person1.age}")
}
class Person(val firstName: String, var age: Int) {
}

プログラムを実行するとき、出力は以下のようになります:

First Name = Joe
Age = 25

Personクラスのオブジェクトを作成する際には、値Joeと 25、まるでPersonが関数のように見えます。

これによりperson1 オブジェクトのfirstNameとage属性はそれぞれ「Joe」と初期化されます。 25。

メインコンストラクタを使用する他の方法もあります。

メインコンストラクタと初期化ステートメントブロック

メインコンストラクタの文法は制約されており、コードを含むことはできません。

初期化コード(初期化属性のコードだけでなく)を配置するために、初期化プログラムブロックを使用しました。init キーワードで前缀として使用しています。以下の例を初期化ステートメントブロックで修正してみましょう:

fun main(args: Array<String>) {
    val person1 = Person("joe", 25)
}
class Person(fName: String, personAge: Int) {
    val firstName: String
    var age: Int
    //初期化ブロック
    init {
        firstName = fName.capitalize()
        age = personAge
        println("First Name = $firstName")
        println("Age = $age")
    }
}

プログラムを実行するとき、出力は以下のようになります:

First Name = Joe
Age = 25

ここでは、personを1をオブジェクトとして作成するとき、括弧内の引数fNameとpersonAgeはそれぞれ「Joe」と 25。しかし、fNameとpersonAgeを使用する場合、varやvalを使用しませんし、それらはPersonクラスの属性ではありません。

PersonクラスはfirstNameとageという2つの属性を宣言しています。

when person1オブジェクトが作成され、初期化ブロック内のコードが実行されます。初期化ブロックは属性を初期化するだけでなく、それらをプリントアウトします。

同じタスクを実行する別の方法です:

fun main(args: Array<String>) {
    val person1 = Person("joe", 25)
}
class Person(fName: String, personAge: Int) {
    val firstName = fName.capitalize()
    var age = personAge
    //初期化ブロック
    init {
        println("First Name = $firstName")
        println("Age = $age")
    }
}

コンストラクタの引数と属性を区別するために、異なる名前を使用しています(fNameとFirstName、およびPersonageとage)。コンストラクタの引数の場合、_firstNameと_ageを使用するのが一般的です。例えば:

class Person(_firstName: String, _age: Int) {
    val firstName = _firstName.capitalize()
    var age = _age
    // 初期化ブロック
    init {
        ... .. ...
    }
}

メインコンストラクタのデフォルト値

コンストラクタの引数にデフォルト値を提供できます(関数のデフォルト引数に似ています)デフォルト引数)。例えば:

fun main(args: Array<String>) {
    println("person"1 がインスタンス化されます)
    val person1 = Person("joe", 25)
    println("person"2 がインスタンス化されます)
    val person2 = Person("Jack")
    println("person"3 がインスタンス化されます)
    val person3 = Person()
}
class Person(_firstName: String = "UNKNOWN", _age: Int = 0) {
    val firstName = _firstName.capitalize()
    var age = _age
    //初期化ブロック
    init {
        println("First Name = $firstName")
        println("Age = $age\n")
    }
}

プログラムを実行するとき、出力は以下のようになります:

First Name = Joe
Age = 25
person2 インスタンス化されました
First Name = Jack
Age = 0
person3 インスタンス化されました
First Name = UNKNOWN
Age = 0

Kotlin 次のコンストラクタ

Kotlinのクラスは、1つまたは複数の次のコンストラクタを含むことができます。これらはconstructorキーワードを使用して作成されます。

Kotlinの次のコンストラクタは非常に稀です。クラスを拡張して、異なる方法でクラスを初期化する複数のコンストラクタを提供する必要がある場合に、次のコンストラクタの最も一般的な使用法が現れます。学習する前に、以下を確認してくださいKotlin 继承

Kotlinで派生コンストラクタを作成する方法は以下の通りです:

class Log {
    constructor(data: String) {
        // 一部のコード
    }
    constructor(data: String, numberOfData: Int) {
        // 一部のコード
    }
}

ここでは、Logクラスには2つの派生コンストラクタがありますが、メインコンストラクタはありません。

このクラスを拡張することができます:

class Log {
    constructor(data: String) {
        // コード
    }
    constructor(data: String, numberOfData: Int) {
        // コード
    }
}
class AuthLog: Log {
    constructor(data: String): super(data) {
        // コード
    }
    constructor(data: String, numberOfData: Int): super(data, numberOfData) {
        // コード
    }
}

ここでは、派生クラスAuthLogのコンストラクタが基底クラスLogの対応するコンストラクタを呼び出しています。これにはsuper()を使用します。

Kotlinでは、Javaのように同一クラスの別のコンストラクタ(次の例を参照)からコンストラクタを呼び出すことができます。

class AuthLog: Log {
    constructor(data: String): this(data, 10) {
        // コード
    }
    constructor(data: String, numberOfData: Int): super(data, numberOfData) {
        // コード
    }
}

例:Kotlin の派生コンストラクタ

fun main(args: Array<String>) {
    val p1 = AuthLog("Bad Password")
}
open class Log {
    var data: String = ""
    var numberOfData = 0
    constructor(_data: String) {
    }
    constructor(_data: String, _numberOfData: Int) {
        data = _data
        numberOfData = _numberOfData
        println("$data: $numberOfData 回数")
    }
}
class AuthLog: Log {
    constructor(_data: String): this("From AuthLog -> " + _data, 10) {
    }
    constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) {
    }
}

プログラムを実行するとき、出力は以下のようになります:

From AuthLog -> Bad Password: 10 times

注意:クラスにメインのコンストラクタがない場合、サブコンストラクタは基底クラスまたはデリゲートを他のコンストラクタで初期化する必要があります(上の例のように)。