Kotlin面向对象

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){
    
    

    }
}

猜你喜欢

转载自blog.csdn.net/qq_41811862/article/details/120808678