一、有主构造函数和次构造函数
第一步:使得Person类可继承,添加open关键字
第二步:Student子类使用主构造函数继承父类Person
注意:主构造函数是没有函数体的,直接定义在类名后面
package com.shellway.helloworld
open class Person {
var name = ""
var age = 0
fun eat(){
println("name = $name , age = $age")
}
}
package com.shellway.helloworld
class Student(var stuNo :Int , var grade : Int) : Person() {
}
fun main (){
var student = Student(1001,3)
println("stuNo = "+ student.stuNo +" ,grade = "+ student.grade)
student.eat()
}
主构造函数没有函数体,那我想在构造函数中写一些逻辑怎么办?kotlin提供了init结构体
package com.shellway.helloworld
class Student(var stuNo :Int , var grade : Int) : Person() {
init {
println("stuNo is $stuNo" )
println("grade is $grade")
}
}
fun main (){
var student = Student(1001,3)
//println("stuNo = "+ student.stuNo +" ,grade = "+ student.grade)
student.eat()
}
打印结果:
stuNo is 1001
grade is 3
name = , age = 0
主构造函数没有函数体,那如果我们要调用父类的构造函数呢?在init中可以调用,但是不推荐,因为大多数时候我们并不需要写init结构体的,kotlin为此另外设计了一种办法。就是在继承的时候通过括号来指定。
所以在这里将Person改造下: 同时子类也必须加上,因为父类有的,子类也必须有
注意:在子类中不能将父类的参数声明成val或者var,否则就会成为子类的字段,这样跟父类的字段造成冲突。
package com.shellway.helloworld
open class Person(var name:String , var age : Int){
fun eat(){
println("name = $name , age = $age")
}
}
package com.shellway.helloworld
class Student(var stuNo :Int , var grade : Int , name:String, age:Int) : Person(name,age) {
init {
println("stuNo is $stuNo")
println("grade is $grade")
}
}
fun main (){
var student = Student(1001,3,"Jerry",23)
//println("stuNo = "+ student.stuNo +" ,grade = "+ student.grade)
student.eat()
}
次构造函数
注意:它必须调用自己的主构造函数,使用this关键字来调用
package com.shellway.helloworld
class Student(var stuNo :Int , var grade : Int , name:String, age:Int) : Person(name,age) {
constructor(name: String,age: Int) : this (1002,3,name,age){}
constructor():this("Jim",10){}
}
fun main (){
var student1 = Student()
var student2 = Student("Jerry",20)
var student3 = Student(1003,3,"Jack",30)
student1.eat()
student2.eat()
student3.eat()
}
打印结果:
name = Jim , age = 10
name = Jerry , age = 20
name = Jack , age = 30
还有一种情况,就是子类只有次构造函数,没有主构造函数。那么这时候就不需要在子类名后面添加括号了,连父类的也省了。所以,在次构造函数中就直接调用父类的构造函数了,使用关键字super
package com.shellway.helloworld
class Student: Person{
constructor():super("Jim",10){}
}
fun main (){
var student = Student()
student.eat()
}
打印结果:
name = Jim , age = 10