选择包名,然后右键:

 

选择Class类型,会有class:

 选择File类型,不会自动有class:

 

 

目录结构:

 


 

定义描述抽象类 Person人类:

package cn.kotlin.kotlin_oop05

/**
 * 抽象类用abstract修饰
 * 描述:人类的抽象
 */
abstract class Person {

    /**
     * 抽象行为用abstract修饰
     * 人类到底怎么吃饭🍚的,无法确定,所以先抽象此行为,只要是人就肯定要吃饭(抽象是关注事物本质)
     */
    abstract fun eat()
    
}

 

描述老师Teacher对象,老师也属于人类:

package cn.kotlin.kotlin_oop05

class Teacher : Person() {
    /**
     * 继承了Person抽象类,就必须要用override重写父类抽象类的行为
     */
    override fun eat() {
        println("老师讲课累,太饿了,在大口大口的吃饭🍚")
    }
}

 

描述学生Student对象,学生也属于人类:

package cn.kotlin.kotlin_oop05

class Student : Person() {

    /**
     * 继承了Person抽象类,就必须要用override重写父类抽象类的行为
     */
    override fun eat() {
        println("学生学习太累太累了,饿成狗了,直接一碗饭一碗饭的倒入口里")
    }
}

 

main测试方法多态的表现:

package cn.kotlin.kotlin_oop05

fun main(args: Array<String>) {
    // 父类 personChildClass = new 子类()
    var personChildClass:Person = Teacher()
    personChildClass.eat()

    // 父类 personChildClass = new 子类()
    personChildClass = Student()
    personChildClass.eat()

    // 父类 personChildClass = new N个子类()
}

执行结果:

 

main测试方法多态的表现:

package cn.kotlin.kotlin_oop05

fun main(args: Array<String>) {
    
    // listOf<Person> 传递的是Person父类抽象类,所以可以增加所有 Person父类抽象类>子类

    var  list = listOf<Person>(Student(), Teacher())
    for (l in list) {
        l.eat()
    }
}

执行结果:

如果不传入 Person父类抽象类>子类 编译不通过: