Kotlin类与继承
admin
2023-07-28 16:20:06
0

Kotlin使用class关键字声明类,类声明由类名、类头(指定其类型参数、主 构造函数等)和由大括号包围的类体组成。

类头和类体都是可选的,如果一个类没有类体大括号可省略

class NoBody


类的构造函数

一类可以有一个主构造函数和一个或多个次构造函数。主构造函数是类头的一部分:它跟在类名(和可选的类型参数)后

主构造函数不能包含任何代码块,可用init块初始化代码,并且可访问主构造函数的参数

class Person constructor(firstName: String) {
    init {
        println(firstName)
    }
}

如果类头没有任何注解或者可见性修饰符,constructor关键字可省略

class Person2(firstName: String) {
    init {
        println(firstName)
    }
}

如果构造函数有注解或可见性修饰符,这个constructor关键字是必需的,并且这些修饰符在它前面

class Person3 public constructor(firstName: String) {
    init {
        println(firstName)
    }
}


次构造函数

类也可以声明次构造函数

class Animal {
    constructor(name: String) {
        println(name)
    }
}

如果一个类有主构造函数,每个次构造函数都需要委托给主构造函数,可以直接委托或者通过其它次构造函数间接委托

使用this关键字直接委托给当前类的主构造函数

class Animal2(name: String) {
    constructor(name: String, age: Int) : this(name) {
        println(name + age)
    }

    init {
        println(name)
    }
}

如果一非抽象类没有任何主或者次构造函数,它会默认生成一个不带参的主构造函数

class Animal3 {}

等同于

class Animal3(){}

将构造函数用private修饰可以防止被创建类的实例

class DontCreate private constructor() {}


创建类的实例

类定义后,需要创建实例才能使用

fun main(args: Array) {
    //实例化,Kotlin类的实例化省去了new关键字
    var person = Person("zhangsna")
    var person1 = Animal3()

    println(person)
    println(person1)

    //private修饰符修饰的构造方法不能实例化
    //var dontCreate = DontCreate()
}


继承

Kotlin和Java一样都有隐式继承,Java中一个类如果没有显示的继承一个类默认继承Object

而Kotlin中默认继承Any

class Example  //隐式继承Any

Any中只有 equals()、hashCode()和toString()三个方法。附Any类源码图

Kotlin类与继承

在Kotlin中所有的类默认为final类型,是不能够被继承的。如果该类需要被继承则必须加上open关键字否则该类编译成class后是一个final类

open class Base {
}

使用:符号实现继承,继承的父类必须初始化

class Car : Base() {
}

如果父类主构造函数有参数子类必须声明一个有参数的主构造函数初始化父类的构造函数

open class Device(name: String) {
    init {
        println(name)
    }
}

class Phone(name: String) : Device(name) {
}

如果父类没有主构造函数,那么子类每个次构造函数都必须使用super关键字调初始化父类次构造函数

open class Device2 {
    constructor(name: String) {
        println(name)
    }

    constructor(type: Int, weight: Int) {
        println("$type" + weight)
    }
}

class Computor : Device2 {
    constructor(name: String) : super(name)
    constructor(type: Int, weight: Int) : super(type, weight)
}


覆盖方法和属性

Kotlin中需要overried关键字显示的覆盖成员

open class Father {
    open var a: Int = 1
    open fun say() {
        println("father say")
    }
}

class Son : Father() {
    //必须加上overried关键字,覆盖父类成员
    override var a: Int = 2

    override fun say() {
        println("son say")
    }
}


抽象类和继承

使用abstract关键字定义抽象类

abstract class Abstract {
    //定义抽象方法时,必能有方法体
    abstract fun absFun()
}
class Sub : Abstract() {
    //子类必须实现父类的抽象方法
    override fun absFun() {
        println("absFun of sub")
    }
}


相关内容

热门资讯

首次乘坐卡塔尔赠送的新“空军一... 据美国广播公司(ABC)报道,当地时间7月1日,美国总统特朗普首次乘坐卡塔尔政府赠送的新“空军一号”...
花100多万,赌一个香港本科 6月23日起,各省高考分数线陆续公布,找陈峰咨询香港副学士的学生和家长骤然增多。他们最常问的是:高考...
世界杯“死亡之组”快被团灭了 ...   世界杯“死亡之组”快被团灭了  【世界杯“死亡之组”快被团灭了】北京时间6月30日,世界杯1/1...
影视飓风Tim直播中险与嘉宾动... 影视飓风Tim直播中险与嘉宾动手  【影视飓风Tim直播中险与嘉宾动手】2026年7月2日,知名数码...
学校外墙瓷砖脱落砸到女高中生,... 7月2日,有广东网友通过社交平台发布视频称,广州市增城区一中学教学楼疑似外墙瓷砖脱落,一女学生被砸到...
感谢德国老铁 又送“全国放假一... 感谢德国老铁 又送“全国放假一天”  【感谢德国老铁 又送“全国放假一天”】北京时间6月30日凌晨,...
第三届澳门国际儿童艺术节精彩持...   由文化局主办的第三届澳门国际儿童艺术节现正举行,多项节目及活动深受大小朋友欢迎,其中《恐龙乐园》...
雇主失联留下女婴 保姆抚养23...   雇主失联留下女婴 保姆抚养23年  【雇主失联留下女婴 保姆抚养23年】7月1日消息,陕西安康保...
泽连斯基紧急中断出访返回基辅 ...   泽连斯基紧急中断出访返回基辅  【泽连斯基紧急中断出访返回基辅】7月2日据报道,因有情报显示俄罗...
仿生机器人订单超预期 优必选定位情感陪伴、不做家务的超仿生机器人预订量达13361台,顶配版最高价格99万元。而在2025...