四、类与对象
类就是对事物的一种封装,而类又可以拥有自己的字段和函数,字段表示该类所拥有的属性,比如说人可以拥有姓名和年龄;而函数则是表示该类可以有哪些行为,比如人可以吃饭和睡觉等
Kotlin也是使用class关键字来声明一个类的
class Person{
var name = ""
var age = 0
fun eat(){
println(name + "is eating.He is " + age + "years old.")}
}
实例化对象
val p = Person()
Kotlin中实例化一个类的方式和Java是基本类似的,只是去掉了new关键字
在main()函数中对p对象进行一些操作
fun main(){
val p = Person()
p.name = "Jack"
p.age = 19
p.eat()
}
这就是面向对象编程最基本的用法,就是要先将事物封装成具体的类,然后将事物所拥有的属性和能力分别定义成类中的字段和函数,接下来对类进行实例化,再根据具体的编程需求调用类中的字段和方法即可。
五、继承与构造函数
想要让Student类继承Person类,需要做两件事:
1、第一件事,使Person类可以被继承
在Kotlin中任何一个非抽象类默认都是不可以被继承的。
在Person类的前面加上open关键字就可以:
open class Person{
...
}
加上open关键字之后,我们就是在主动告诉Kotlin编译器,Person这个类是专门为继承而设计的,这样Person类就允许被继承了
2、第二件事,要让Student类继承Person类,在Java中继承的关键字是extends,而在Kotlin中变成了一个冒号:
class Student : Person(){
var sno = ""
var grade = 0
}
构造函数
子类有主构造函数
如果子类有主构造函数, 则基类必须在主构造函数中立即初始化。
open class Person(var name : String, var age : Int){// 基类
}
class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {
}
// 测试
fun main(args: Array<String>) {
val s = Student("Runoob", 18, "S12346", 89)
println("学生名: ${s.name}")
println("年龄: ${s.age}")
println("学生号: ${s.no}")
println("成绩: ${s.score}")
}
输出结果:
学生名: Runoob 年龄: 18 学生号: S12346 成绩: 89
子类没有主构造函数
如果子类没有主构造函数,则必须在每一个二级构造函数中用 super 关键字初始化基类,或者在代理另一个构造函数。初始化基类时,可以调用基类的不同构造方法。
class Student : Person {
constructor(ctx: Context) : super(ctx) {
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}
实例:
/**用户基类**/
open class Person(name:String){
/**次级构造函数**/
constructor(name:String,age:Int):this(name){
//初始化
println("-------基类次级构造函数---------")
}
}
/**子类继承 Person 类**/
class Student:Person{
/**次级构造函数**/
constructor(name:String,age:Int,no:String,score:Int):super(name,age){
println("-------继承类次级构造函数---------")
println("学生名: ${name}")
println("年龄: ${age}")
println("学生号: ${no}")
println("成绩: ${score}")
}
}
fun main(args: Array<String>) {
var s = Student("Runoob", 18, "S12345", 89)
}
-------基类次级构造函数---------
-------继承类次级构造函数---------
学生名: Runoob
年龄: 18
学生号: S12345
成绩: 89