类与对象
类:就是具有相似的属性和相同行为的对象的抽象。
- Kotlin中定义的类默认是不可继承的(相当于Java中的final类)。
例如,我们可以使用下面的代码定义一个类,以及声明它所拥有的字段和函数:
class Person { //定义一个类
val name = ""
val age = 0
fun eat() {
println(name + " is eating. He is " + age + " years old.")
}
}
fun main() {
val p = Person() //实例化一个对象
p.name = "Jack"
p.age = 19
p.eat()
}
注:1.val p = Person(),这里的p是val类型的,只能指向当前这个Person,即**p所引用的对象不可变**;
2.类中所有的变量都要被初始化,除非它是一个抽象类。
- 如果想要让一个类可以被继承,需要用open关键字去主动声明,例如:
open class Person {
'''
}
- 如果我们要让另一个类去继承Person类,那么就需要使用冒号关键字,而且要保证两者在逻辑上有is-a的关系。例如,让Student类去继承Person类:
class Student : Person() {
var sno = ""
var grade = 0
}
从上述代码中,我们可以发现,Student类中不光自动拥有了从Person类中继承的字段和函数,同时又定义了自己独有的字段和函数(sno、grade)。
构造函数
- 主构造函数:
1.每个类默认有一个不带参数的主构造函数
2.显示定义,无函数体,直接定义在类名的后面(但要指明参数)
class Student : Person() { //默认主构造函数
var sno = ""
var grade = 0
}
class Student(val sno:String, val grade:Int) : Person() {
} //显示定义无函数体的主构造函数
class Student(val sno:String, val grade:Int) : Person() {
init{
println(“sno is ”+sno)
println(“grade is ”+grade)
}
} //主构造函数的逻辑可以写在init结构里
- 次构造函数
1.使用constructor关键字定义,有函数体
2.次构造函数必须调用主构造函数(包括间接调用)
class Student(val sno:String, val grade:Int, name:String, age:Int) : Person(name,age) {
constructor(name:String,age:Int) : this(“”,0,name,age){ }
constructor() : this(“”,0)
} //类里同时有主构造函数和次构造函数
class Student : Person {
constructor(name:String,age:Int) : super(name,age){ }
} //类里只有次构造函数(少见)
注:次构造函数一定要调用主构造函数(this),没有主构造函数,要调用父类构造函数(super)
- 接口
Kotlin中定义接口的关键字和Java中是相同的,都是使用的interface,调用接口时使用override重定义,改变其body。例如:
interface Study {
fun readBooks()
fun doHomework()
} //定义接口
class Student(val name: String, val age: Int) : Person(name,age),Study {
override fun readBooks() {
println(name + " is reading.")
}
override fun doHomework() {
println(name + " is doing homework.")
}
} //调用接口:接口里的方法都要被实现
面向接口的编程:我们可以把接口封装在一个函数里,使用的时候直接调用该函数就行。相关内容如下:
fun doStudy(s:Study){
s.readBooks()
s.doHomework()
}
fun main(){
val student = Student(“Jack",20)
//student.readBooks()
//student.doHomework()
doStudy(student)
}