Kotlin普通类的声明和构造函数

Kotlin中类的声明使用class关键字,  在class后面跟类名即可例如:
class Empty

class Stu {
    fun getName() : String {
       return "default"
    }
}

class stud {
    fun getAge() : Int {
        return 0
    }
}

上面这段代码共创建了三个类, 第一个是一个空类, 第二个和第三个是正常的类, 可以看到类名首字母大写或小写都可以, 但是还是大写比较合适.

        kotlin中类的构造函数和java中略有不同, kotlin中构造函数分为主构造函数和次构造函数, 主构造函数是卸载类名后面, 例如:

class Student2 constructor(name : String) {
    init {
        println("name is : $name")
    }
}

Student2类的主构造函数只有一个String类型的name参数, 2~4行为主构造函数的代码块

fun main(args: Array<String>) {
    val stu = Student2("小明")
}

执行这段代码就会打印"name is 小明"也就是会执行init的代码块中的代码, 因此可以在init里对属性做初始化例如:

class Student2 constructor(name : String, age : Int) {
    var nameStr : String = "default"
    var ageInt = 0
    init {
        nameStr = name
        ageInt = age
        println("name is : $name")
    }
}

甚至可以直接给类的成员变量赋值例如:

class Student2 constructor(name : String, age : Int) {
    var nameStr = name
    var ageInt = age
    init {
        println("name is : $nameStr , age is $ageInt")
    }
}

更简单的写法, 可以直接把类的成员变量声明在构造函数中例如:

class Student2 constructor(val name : String, val age : Int) {
    init {
        println("name is : $name , age is $age") // name is : 小明 , age is 10
    }
}

fun main(args: Array<String>) {
    val stu = Student2("小明", 10)
    println(stu.name + " " + stu.age) // 小明 10
}

一种简单的写法, 可以主构造器可以省略constructor关键字:

class Student2 (val name : String, val age : Int) {
    init {
        println("name is : $name , age is $age")
    }
}

注意: 果构造器有注解,或者有可见度修饰符,这时constructor关键字是必须的,注解和修饰符要放在它之前, 例如如下这种写法:

class Student2 private (val name : String, val age : Int) {
    init {
        println("name is : $name , age is $age")
    }
    constructor(name : String) : this(name, 20)
}

这种写法会提示如下错误:

Error:(22, 16) Kotlin: Use 'constructor' keyword after modifiers of primary constructor

我们做这样的修改就可以了:

class Student2 private (val name : String, val age : Int) {
    init {
        println("name is : $name , age is $age")
    }
    constructor(name : String) : this(name, 20)
}

fun main(args: Array<String>) {
    val stu = Student2("小明")
    println(stu.name + " " + stu.age)
}
例子中我们的主构造器定义成了private类型,  但在类内部定义了一个从构造器(第5行), 利用this关键字 调用了双参数的主构造器, 并给类的成员变量name和age进行了赋值


猜你喜欢

转载自blog.csdn.net/c1392851600/article/details/80945646