原文: https://beginnersbook.com/2019/03/kotlin-constructors/

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

Kotlin 中的构造器类型

Kotlin 构造器 - 图1

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

1.主构造器

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

  1. fun main(args: Array<String>) {
  2. //creating the object of class Student
  3. val stu = Student("Chaitanya", 31)
  4. println("Student Name: ${stu.name}")
  5. println("Student Age: ${stu.age}")
  6. }
  7. class Student(val name: String, var age: Int) {
  8. //This is my class. For now I am leaving it empty
  9. }

输出:

Kotlin 构造器 - 图2

Kotlin 构造器中的默认值

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

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

  1. fun main(args: Array<String>) {
  2. //creating the object of class Student
  3. val stu = Student("Chaitanya", 31)
  4. val stu2 = Student("Chaitanya")
  5. val stu3 = Student()
  6. println("Name: ${stu.name} and Age: ${stu.age}")
  7. println("Name: ${stu2.name} and Age: ${stu2.age}")
  8. println("Name: ${stu3.name} and Age: ${stu3.age}")
  9. }
  10. class Student(val name: String = "Student", var age: Int = 99) {
  11. //This is my class. For now I am leaving it empty
  12. }

输出:

Kotlin 构造器 - 图3

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

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

  1. fun main(args: Array<String>) {
  2. val stu = Student("Chaitanya", 31)
  3. val stu2 = Student("Chaitanya")
  4. val stu3 = Student()
  5. }
  6. class Student(val name: String = "Student", var age: Int = 99) {
  7. val stuName: String
  8. var stuAge: Int
  9. init{
  10. if(name == "Student") {
  11. stuName = "NA"
  12. stuAge = 0
  13. }
  14. else {
  15. stuName = name.toUpperCase()
  16. stuAge = age
  17. }
  18. println("Student Name is: $stuName")
  19. println("Student Age is: $stuAge")
  20. }
  21. }

输出:

Kotlin 构造器 - 图4

2. Kotlin 次要构造器

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

次要构造器的语法

  1. class Student {
  2. constructor(name: String) {
  3. // code inside constructor
  4. }
  5. constructor(name: String, age: Int) {
  6. // code inside constructor
  7. }
  8. }

次要构造器的示例

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

  1. fun main(args: Array<String>){
  2. val obj = Student ("Ajeet", 30)
  3. }
  4. class Student{
  5. constructor(name: String, age: Int){
  6. println("Student Name: ${name.toUpperCase()}")
  7. println("Student Age: $age")
  8. }
  9. }

输出:

  1. Student Name: AJEET
  2. Student Age: 30

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

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

  1. fun main(args: Array<String>){
  2. val obj = Student ("Ajeet")
  3. }
  4. class Student{
  5. constructor(name: String): this(name, 0){
  6. println("secondary constructor with one param")
  7. }
  8. constructor(name: String, age: Int){
  9. println("secondary constructor with two param")
  10. println("Student Name: ${name.toUpperCase()}")
  11. println("Student Age: $age")
  12. }
  13. }

输出:

Kotlin 构造器 - 图5

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

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

  1. fun main(args: Array<String>){
  2. val stu = Student("Harry", 24)
  3. }
  4. open class College{
  5. constructor(name: String, age: Int){
  6. println("parent class constructor")
  7. println("Student Name: ${name.toUpperCase()}")
  8. println("Student Age: $age")
  9. }
  10. }
  11. class Student: College{
  12. constructor(name: String, age: Int): super(name,age){
  13. println("child class constructor")
  14. println("Student Name: $name")
  15. println("Student Age: $age")
  16. }
  17. }

输出:

  1. parent class constructor
  2. Student Name: HARRY
  3. Student Age: 24
  4. child class constructor
  5. Student Name: Harry
  6. Student Age: 24