# Kotlin 构造器

> 原文： [https://beginnersbook.com/2019/03/kotlin-constructors/](https://beginnersbook.com/2019/03/kotlin-constructors/)

构造器的主要目的是初始化类的属性。在创建类的对象时调用构造器。在 Kotlin 中，我们有两种类型的构造器 - 主构造器和次要构造器。在本指南中，我们将通过示例学习主要和次要构造器，我们还将了解初始化程序块。

## Kotlin 中的构造器类型

![Kotlin Constructors](img/530a311d301c512f49fc776afa0bc47a.jpg)

1.  主构造器 - 初始化类
的属性 
2.  次要构造器 - 初始化类的属性，我们可以在次要构造器中有额外的初始化代码。

## 1.主构造器

主构造器是初始化类的最简单方法。它被声明为类头的一部分。在下面的示例中，我们将构造器`(val name: String, var age: Int)`声明为类头的一部分。这是我们的主要构造器，它初始化类`Student`的`name`和`age`属性（数据成员）。

```kotlin
fun main(args: Array<String>) {

    //creating the object of class Student
    val stu = Student("Chaitanya", 31)

    println("Student Name: ${stu.name}")
    println("Student Age: ${stu.age}")
}

class Student(val name: String, var age: Int) {
    //This is my class. For now I am leaving it empty
}
```

**输出：**

![Kotlin constructor example](img/affcbd7ce943fba6c0038b48dae3c3cc.jpg)

## Kotlin 构造器中的默认值

我们也可以像在下面的例子中那样在 Kotlin 构造器中指定默认值。在这里，我们将默认学生姓名指定为`"Student"`，默认学生年龄为 99。

我们创建了这个类的三个对象，一个具有名称和年龄，第二个对象只有名称，第三个对象没有名称和年龄。正如您在输出中所看到的，创建类的对象时默认值被传递的值覆盖。

```kotlin
fun main(args: Array<String>) {

    //creating the object of class Student
    val stu = Student("Chaitanya", 31)
    val stu2 = Student("Chaitanya")
    val stu3 = Student()

    println("Name: ${stu.name} and Age: ${stu.age}")
    println("Name: ${stu2.name} and Age: ${stu2.age}")
    println("Name: ${stu3.name} and Age: ${stu3.age}")

}

class Student(val name: String = "Student", var age: Int = 99) {
    //This is my class. For now I am leaving it empty
}
```

**输出：**

![Default value in Kotlin constructor](img/23ba9a79b2722561cd7ecf9c90982327.jpg)

## Kotlin 构造器中的初始化程序块

让我们学习在类的构造器中有额外的初始化代码。在下面的例子中，我们有一个初始化块，我们在构造器中使用`init`声明了它。在这个块中，我们可以有额外的初始化逻辑。

```kotlin
fun main(args: Array<String>) {

    val stu = Student("Chaitanya", 31)
    val stu2 = Student("Chaitanya")
    val stu3 = Student()

}

class Student(val name: String = "Student", var age: Int = 99) {
    val stuName: String
    var stuAge: Int
    init{
        if(name == "Student") {
            stuName = "NA"
            stuAge = 0
        }
        else {
            stuName = name.toUpperCase()
            stuAge = age
        }
        println("Student Name is: $stuName")
        println("Student Age is: $stuAge")
    }
}
```

**输出：**

![Initializer Block inside Kotlin Constructor](img/4033180c3c1ead6ccb6fb7e481662515.jpg)

## 2. Kotlin 次要构造器

Kotlin 中的次要构造器是使用`constructor`关键字创建的。他们在继承中发挥着重要作用。我建议您在通过次要构造器之前先阅读继承主题。

### 次要构造器的语法

```kotlin
class Student {
    constructor(name: String) {
        // code inside constructor
    }
    constructor(name: String, age: Int) {
        // code inside constructor
    }
}
```

### 次要构造器的示例

这是如何在类中声明次要构造器的简单示例。

```kotlin
fun main(args: Array<String>){
    val obj = Student ("Ajeet", 30)
}

class Student{
    constructor(name: String, age: Int){
        println("Student Name: ${name.toUpperCase()}")
        println("Student Age: $age")
    }
}
```

**输出：**

```kotlin
Student Name: AJEET
Student Age: 30
```

### 从另一个调用一个次要构造器

在这个例子中，我们有两个次要构造器，一个具有一个参数，另一个具有两个参数。我们使用`this`关键字从另一个构造器调用构造器。

```kotlin
fun main(args: Array<String>){
    val obj = Student ("Ajeet")
}
class Student{
    constructor(name: String): this(name, 0){
        println("secondary constructor with one param")
    }
    constructor(name: String, age: Int){
        println("secondary constructor with two param")
        println("Student Name: ${name.toUpperCase()}")
        println("Student Age: $age")
    }
}
```

**输出：**

![Kotlin secondary constructor](img/8bb858ae07517315d3b6e1f38e398c4c.jpg)

### 带有父类和子类的 Kotlin 次要构造器示例

在下面的例子中，我们有两个类`College`，它是父类和子类`Student`。这里子类的次要构造器使用`super`关键字调用父类的次要构造器。

```kotlin
fun main(args: Array<String>){
    val stu = Student("Harry", 24)
}

open class College{

    constructor(name: String, age: Int){
        println("parent class constructor")
        println("Student Name: ${name.toUpperCase()}")
        println("Student Age: $age")
    }
}
class Student: College{
    constructor(name: String, age: Int): super(name,age){
        println("child class constructor")
        println("Student Name: $name")
        println("Student Age: $age")
    }
}
```

**输出：**

```kotlin
parent class constructor
Student Name: HARRY
Student Age: 24
child class constructor
Student Name: Harry
Student Age: 24
```