Kotlin 构造函数

Kotlin 构造函数,从前面所学到的知识可以发现,实例化一个类的对象后,如果要为这个对象中的属性赋值,则必须要通过“对象.属性”的方式才可以。如果需要在实例化对象的同时就为这个对象的属性进行赋值,可以通过构造函数来实现。构造函数是类的一个特殊成员,它会在类实例化对象时被自动调用。Kotlin中的构造函数分为两种——主构函数和次构函数。本章我们将针对Kotlin中的构造函数进行详细讲解。

主构函数

在Kotlin中,构造函数使用constructor关键字进行修饰,一个类可以有一个主构造函数和多个次构造函数。主构函数位于类头跟在类名之后,如果主构造函数没有任何注解或可见性修饰符(如public),constructor关键字可省略。主构函数定义的语法格式如下:

class类名constructor([ 形参1,  形参2,  形参3]){}

在上述语法格式中,通过constructor关键字定义了一个主构函数,当在定义一个类时,如果没有显示指定主构函数,则Kotlin编译器会默认为其生成一个无参主构函数,这点和Java是一样的。无参数的主构函数有两种写法,具体如下:

class类名constructor(){}    //第1种写法 
class类名 (){}              //第2种写法,省略constructor,即普通类的定义形式

在实际开发中,经常会用到有参的主构函数,通过有参的构造函数为属性赋值。在主构函数中赋值时,通常使用init{}初始化代码块,专门用于属性的初始化工作,接下来我们通过一个案例来学习有参主构函数的使用,具体代码如下所示。

package com.itheima.chapter04
class Clerk constructor(username: String) {
    var name: String
    init {
        name = username
        println(" 我叫$name")
    }
}
fun main(args: Array<String>) {
   var clerk = Clerk(" 江小白")
}

运行结果:

我叫江小白

上述代码中,定义了一个有参数的主构函数,然后通过init{}代码块对name属性进行赋值,并输出name的值。在main()函数中,通过Clerk("江小白")构造函数在创建对象时赋值,最终输出运行结果“我叫江小白”。

this关键字

主构函数中,使用变量name表示姓名时,构造函数中使用的是username,成员变量使用的是name,这样的程序可读性很差。其实我们就会考虑是否可以将一个类中表示姓名的变量都用name统一命名呢?但是这样又会导致成员变量和局部变量的命名冲突的问题,为此Kotlin中也提供了this关键字,用于在函数中访问对象的其他成员,其语法格式为“this.成员名”

接下来将为大家演示在程序中如何使用this关键字,具体如下所示。

package com.itheima.chapter04
class Employees constructor(name: String) {
    var name: String
    init {
        this.name = name
        println(" 我叫$name")
    }
}
fun main(args: Array<String>) {
   var employees = Employees(" 江小白")
}

运行结果:

我叫江小白

在上述代码中,定义了一个成员变量name,在主构函数中传递一个同名的形参name,当调用成员变量时,则使用“this.name”的形式,表示调用该对象中的成员变量,然后进行赋值。

次构函数

在Kotlin中,可以定义多个次构函数,次构函数同样使用constructor关键字定义,只不过次构函数位于类体中。其实大家一定会有这样的想法,要想实现属性的初始化,定义一个主构函数不就可以了吗?为什么还要定义次构函数呢?但实际上在赋值时,可能会有多种情况,例如有时只需要给name属性赋值,有时需要同时给name属性和age属性赋值,这时会发现只有一个主构函数是不够用的,因此还需要定义一个次构函数。次构造函数必须调用主构造函数或其他次构造函数,其调用方式为“次构函数:this(参数列表)”

需要注意的是,当新定义的次构造函数调用主构造函数或次构造函数时,被调用的构造函数中参数的顺序必须与新定义的次构造函数中参数的顺序一致,并且参数个数必须小于新定义的次构造函数中参数的个数。
接下来我们通过一个案例来学习次构函数的使用,具体如下所示。

package com.itheima.chapter04
class Workers constructor(name: String) {
    var name: String
    init {
        this.name = name
        println(" 我叫${name}")
    }
    constructor(name: String, age: Int) : this(name) {
        println(" 我叫${name},我今年${age} 岁。")
   }
   constructor(name: String, age: Int, sex: String) : this(name, age) {
       println(" 我叫${name},我今年${age} 岁,我是${sex} 生。")
   }
}
fun main(args: Array<String>) {
   var pseron = Workers(" 江小白", 18, " 男")
}

运行结果:

我叫江小白
我叫江小白,我今年18岁。
我叫江小白,我今年18岁,我是男生。

在上述代码中,定义了1个主构函数和2个次构函数,其中主构函数传递一个参数,第1个次构函数传递2个参数,第2个次构函数传递3个参数,并且第1个次构函数继承自主构函数,第2个次构函数继承自第1个次构函数。在main()函数中,使用Workers("江小白",18,"男")创建对象并赋值时,从运行结果可以看出,不仅第2个次构函数被调用,第1个次构函数和主构函数都会被调用。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!