学习Kotlin语言之类和对象
2020-10-20 本文已影响0人
千夜零一
类与对象
Kotlin中也是使用class关键字来声明一个类的,这一点和Java一致。
- 如何创建类
class Person {
var name = ""
var age = 0
fun eat() {
println(name + "is eating.He is" + age + "years old.")
}
}
这里使用var关键字创建了name和age两个字段,这是因为我们需要在创建对象之后再指定具体的姓名和年龄,而如果使用val关键字的话,初始化之后就不能再重新赋值了。接下来定义了一个eat()函数,并在函数中打印了一句话。
-
如何对类进行实例化
val p = person()
Kotlin中实例化一个类的方式和Java基本类似,只是去掉了new关键字而已。之所以这样设计,是因为当你调用了某个类的构造函数时,你的意图只可能是对这个类进行实例化,因此即使没有new关键字,也能清晰表达出你的意图。
下面通过代码对p对象进行一些操作。
private fun main(){
val p = Person()
p.name = "千夜零一"
p.age = 23
p.eat() //System.out: 千夜零一is eating.He is23years old.
}
类的继承
这是面向对象的另一个极其重要的特征。现在创建Student类,继承自Person类。
class Student {
var son = ""
var grade = 0
}
现在Student和Person这两个类之间是没有任何继承关系的,想要让Student类继承Person类,还需要做两件事情。
-
第一件事:使Person类可以被继承。
很多人奇怪,尤其是有Java编程经验的人。一个类本身不就是可以被继承的吗?为什么还要使Person类可以被继承呢?这就是Kotlin不同于Java的地方,在Kotlin中任何一个非抽象类默认都是不可以被继承的,相当于Java中给类声明了final关键字。之所以这么设计,其实和val关键字的原因差不多,因为类和变量一样,最好都是不可变的,而一个类允许被继承的话,它无法预知子类会如何实现,因此可能就会存在一些未知的风险。
那么如何让Person类可以被继承呢?方法其实很简单,在Person类的前面加上open关键字就可以了。
open class Person {
……
}
-
第二件事情:要让Student继承Person类。
在Java中继承的关键字是extends,而在Kotlin中变成了一个冒号,写法如下:
class Student : Person() {
var son = ""
var grade = 0
}
构造函数
任何一个面向对象的编程语言都会有构造函数的概念,Kotlin中也有,但是Kotlin将构造函数分为了两种:主构造函数和次构造函数。
-
主构造函数
这是我们最常用到的构造函数,每个类默认都会有一个不带任何参数的主构造函数,当然你也可以显式地给它指明参数。主构造函数的特点是没有函数题,直接定义在类名的后面即可。
class Student(val sno: String, val grade: Int) : Person() { }
这里我将学号和年级两个字段都放到了主构造函数当中,这表明在对Student类进行实例化的时候,必须传入构造函数中要求的所有参数。
val student = Student("123",5)
由于构造函数中的参数是在创建实例的时候传入的,不像之前的写法那样还得重新赋值,因此可以将参数全部声明成val。
你可能会问,主构造函数没有函数体,如果我们想在主构造函数中编写一些逻辑,如何实现呢?Kotlin给我们提供了一个init结构体,所有主构造函数中的路基都可以写在里面:
class Student(val sno: String, val grade: Int) : Person() {
init {
println("sno = " + sno)
println("grade = " + grade)
}
}
-
次构造函数
任何一个类只能有一个主构造函数,但是可以有多个次构造函数。次构造函数也可以用于实例化一个类,这一点和主构造函数没有什么不同,只不过它是有函数体的。次构造函数使用constructor关键字创建。
1、改造Person类:
open class Person(val name: String, val age: Int) { }
2、相应的Student类也做相应改造:
class Student(sno: String,grade: Int, name: String, age: Int) : Person(name, age) {
constructor(name: String, age: Int) : this("", 0, name, age) {
}
constructor() : this("", 0){
}
}
这样就拥有了三种方式来对Student类进行实体化,分别是不带参数的构造函数、带2个参数的构造函数和带4个参数的构造函数,对应代码如下:
val student1 = Student()
val student2 = Student("千夜零一",23)
val student3 = Student("123",5,"千夜零一",23)