1、创建Person类:
class Person {
var name = ""
var age = 0
fun eat(){
println(name + " is eating. He is " + age + "years.old.")
}
}
main()中使用:
fun main(){
val p = Person()
p.name = "Jack"
p.age = 22
p.eat()
}
2、继承
(1)在Person类前面加上open关键字,表示允许继承
open class Person {
......
}
(2) 在Student中,用 “:” 继承Person类
class Student : Person() {
var sno = ""
var grade = 0
}
加上括号的原因:相当于构造函数
Java和kotlin的继承特性:子类中的构造函数必须调用父类中的构造函数
3、构造函数
分为主构造函数和次构造函数
主构造函数:
没有函数体,直接定义在类名后面:
class Student(val sno: String, val grade: Int) : Person() {
}
如果想在主构造函数中写一些逻辑:使用init结构体:
class Student(val sno: String, val grade: Int) : Person() {
init {
println("son : " + sno)
println("grade: " + grade)
}
}
main:
fun main(){
val student = Student("abao", 12)
}
继承有参主构造函数:
Person:
open class Person(val name: String, val age: Int) {
fun eat(){
println(name + " is eating. He is " + age + "years.old.")
}
}
Student:
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {
init {
println("son : " + sno)
println("grade: " + grade)
}
}
这里在Student的主构造函数中添加name和age参数,再将这两个参数传给Person类的构造函数。注意name和age字段不能将它们声明为val,因为在主构造函数中声明成val或者var的参数将自动成为该类的字段,就会导致和父类中同名的name和age字段造成冲突。
main:
fun main(){
val student = Student("1234", 12, "abao", 13)
}
4、次构造函数:(几乎用不到,给函数设定参数默认值的功能基本可以替代次构造函数的作用)
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {
init {
println("son : " + sno)
println("grade: " + grade)
}
//① 接收name和age参数,通过this关键字调用主构造函数,并将sno和grade这两个参数赋值成初始值;
constructor(name: String, age: Int) : this("", 0, name, age){
}
//不接收任何参数,通过this调用①,并将name和age参数赋值成初始值,间接调用了主构造函数,所以是合法的。
constructor() : this("", 0){
}
}
特殊情况:
类中只有次构造函数,没有主构造函数。
Student类后面没有显式地定义主构造函数,定义了次构造函数,次构造函数中直接调用super关键字引用父类构造器
class Student : Person{
constructor(name: String, age: Int) : super(name, age){
}
}