Kotlin基础学习 11

本文详细介绍了Kotlin中Any超类的使用,对象声明的特性,对象表达式的不同实现,伴生对象的作用,嵌套类的复杂性,数据类的copy函数,解构声明的应用,以及运算符重载和枚举类的实战。深入理解这些概念有助于提升Kotlin编程技能。
摘要由CSDN通过智能技术生成

目录

1.Kotlin语言的Any超类学习

2.Kotlin语言的对象声明学习

3.Kotlin语言的对象表达式学习

4.Kotlin语言的伴生对象学习

5.Kotlin语言的嵌套类学习

6.Kotlin语言的数据类学习

7.Kotlin语言的copy函数学习

8.Kotlin语言的解构声明学习

9.Kotlin语言的运算符重载学习

10.Kotlin语言的枚举类学习


1.Kotlin语言的Any超类学习

//在KT中,所有的类,都隐式继承了 :Any() ,你不写,默认就有
// Any类在KT设计中:只提供标准,你看不到实现,实现在各个平台处理就好
class Obj1 : Any()
class Obj2 : Any()
class Obj3 : Any()
// TODO 85.Kotlin语言的Any超类学习
// Any == java Object
fun main(){
    println(Obj1().toString())
}

2.Kotlin语言的对象声明学习

object KtBase86{
    init {
        println("KtBase86 init...")
    }
    fun show() = println("我是show函数...")
}
// TODO 86.Kotlin语言的对象声明学习
fun main(){
    //object KtBase86 既是单例的实例,也是类名
    //小结:既然是单例的实例,又是类名,只有一个创建,这就是典型的单例
    println(KtBase86) //背后代码:println(KtBase86.INSTANCE)
    //背后代码:KtBase86.INSTANCE.show()
    println(KtBase86.show())
}

3.Kotlin语言的对象表达式学习

interface RunnableKT {
    fun run()
}

open class KtBase87 {
    open fun add(info: String) = println("KtBase87 add:$info")
    open fun del(info: String) = println("KtBase87 del:$info")
}

// TODO 87.Kotlin语言的对象表达式学习
fun main() {
    //匿名对象 表达式方式
    val p : KtBase87 = object : KtBase87(){
        override fun add(info: String) {
            //super.add(info)
            println("我是匿名对象 add:$info")
        }

        override fun del(info: String) {
            //super.del(info)
            println("我是匿名对象 del:$info")
        }
    }
    p.add("张三")
    p.del("李四")
    //具名实现方式
    val p2 = KtBase87Impl()
    p2.add("赵六")
    p2.del("赵七")

    //对java的接口 用 KT[对象表达式]  方式一
    val p3 = object : Runnable{
        override fun run() {
            println("Runnable run...")
        }
    }
    p3.run()

    //对java的接口 用 java 最简洁的方式 方式二
    val p4 = Runnable {
        println("Runnable run2...")
    }
    p4.run()

    //对KT的接口 用 KT[对象表达式]   方式一
    object : RunnableKT {
        override fun run() {
            println("RunnableKT 方式一 run ...")
        }
    }.run()

}

//小结:Java接口,有两种方式 1(object : 对象表达式)2 简洁版
//     KT接口     只有一种方式 1(object : 对象表达式)

//具名实现 具体名字 == KtBase87Impl
class KtBase87Impl : KtBase87() {
    override fun add(info: String) {
        //super.add(info)
        println("我是具名对象 add:$info")
    }

    override fun del(info: String) {
        //super.del(info)
        println("我是具名对象 del:$info")
    }
}

4.Kotlin语言的伴生对象学习

class KtBase88 {
    //伴生对象
    companion object {
        val info = "BxbInfo"
        fun showInfo() = println("显示info:$info")
        val name = "Bxb"
    }
}

// TODO 88.Kotlin语言的伴生对象学习
//伴生对象的由来:在KT中是没有java这种static静态,半生很大程度和java这种static静态差不多
// 无论KtBase88() 构建对象多少次,我们的伴生对象,只有一次加载
// 无论KtBase88.showInfo() 调用多少次,我们的伴生对象,只有一次加载
// 伴生对象只会初始化一次
fun main() {
    println(KtBase88.info)
    println(KtBase88.name)
    KtBase88.showInfo()
}

5.Kotlin语言的嵌套类学习

// TODO 内部类
// 内部类的特点:内部的类 能访问 外部的类
//              外部的类 能访问 内部的类
class Body(_bodyInfo: String){ //身体类
    val bodyInfo = _bodyInfo
    fun show(){
        Heart().run()
    }
    // 默认情况下:内部的类 不能访问 外部的类,要增加inner成为内部类才可以访问外部类
    inner class Heart{ //心脏类
        fun run() = println("心脏访问身体信息:$bodyInfo")
    }
    inner class Kidney{ //肾脏
        fun work() = println("肾脏访问身体信息:$bodyInfo")
    }
    inner class Hand{ //手
        inner class LeftHand{
            fun run() = println("左手访问身体信息:$bodyInfo")
        }
        inner class RightHand{
            fun run() = println("右手访问身体信息:$bodyInfo")
        }
    }
}
//TODO 嵌套类
// 默认情况下:都是嵌套关系
// 嵌套类特点:外部的类 能访问 内部的嵌套类
//            内部的类 不能访问 外部类的成员
class Outer{
    val info : String = "OK"
    fun show(){
        Nested().output()
    }
    class Nested{
        fun output() = println(" 嵌套类")
    }
}
// TODO 89.Kotlin语言的嵌套类学习
fun main() {
    //内部类:
    Body("isOK").Heart().run()
    Body("isOK").show()
    Body("isOK").Kidney().work()
    Body("isOK").Hand().LeftHand().run()
    Body("isOK").Hand().RightHand().run()
    //嵌套类
    Outer.Nested().output()
    Outer().show()
}

6.Kotlin语言的数据类学习

//普通类
class ResponseResultBean1(var msg:String,var code:Int,var data:String):Any()
//set get 构造函数
//数据类 ---- 一般用于Javabean的形式下,用数据类
data class ResponseResultBean2(var msg:String,var code:Int,var data:String):Any()
// set get构造函数 解构操作 copy toString hashCode equals 数据类 生成更丰富
// TODO 90.Kotlin语言的数据类学习
// 1.普通类与数据类的 toString 背后原理
// 2.前面学习过的 == 与 ===
// 3.普通类的 == 背后原理
// 4.数据类的 == 背后原理
fun main() {
    // val(v1,v2,v3) = list 这个是list集合之前的 解构操作
    println(ResponseResultBean1("loginSuccess",200,"登录成功的数据..."))
    //普通类:Any() toString Windows实现打印了   com.bxb.s5.ResponseResultBean1@266474c2
    println(ResponseResultBean2("loginSuccess",200,"登录成功的数据..."))
    //数据类:Any() 默认重写了父类的 toString 打印子类的toString详情   ResponseResultBean2(msg=loginSuccess, code=200, data=登录成功的数据...)
    println()

    //前面我们学习 == 值的比较 相当于java的equals   === 引用对象比较
    println(
        ResponseResultBean2("loginSuccess",200,"登录成功的数据...") ==
                ResponseResultBean2("loginSuccess",200,"登录成功的数据...")
    )
    //Any父类的 equals被数据类 重写了 equals 会调用子类的 equals函数(对值的比较)

    println(
        ResponseResultBean1("loginSuccess",200,"登录成功的数据...") ==
                ResponseResultBean1("loginSuccess",200,"登录成功的数据...")
    )
    //Any父类 的equals 实现 (ResponseResultBean1对象引用 比较 ResponseResultBean1对象引用)
}

7.Kotlin语言的copy函数学习

data class KtBase91(var name : String,var age : Int) //主构造
{
    var coreInfo : String = "123"
    init {
        println("主构造被调用了")
    }
    //次构造
    constructor(name : String) : this(name,99){
        println("次构造被调用")
        coreInfo = "增加非常核心的内容信息"
    }

    override fun toString(): String {
        return "toString name:$name,age:$age,coreInfo:$coreInfo"
    }
}
/*
*   生成的toString为什么只有两个参数?
*   答:默认生成的toString 或者 hashcode equals 等等 只管主构造,不管次构造
* */
// TODO 91.Kotlin语言的copy函数学习
fun main() {
    val p1 = KtBase91("张三三") //调用次构造初始化对象
    println(p1)

    val newP2 = p1.copy("李四四",66)
    println(newP2)

    //copy toString hashcode equals 等等 只管主构造,不管次构造
    //注意事项:使用copy 的时候,由于内部代码只处理主构造,所以必须考虑次构造的内容
}

8.Kotlin语言的解构声明学习

//普通类
class Student1(var name : String,var age : Int,var sex:Char)
{   //注意事项:component0 顺序必须是 component1 component2 component3 和成员一一对应,顺序下来的
    operator fun component1() = name
    operator fun component2() = age
    operator fun component3() = sex
}
// 数据类
data class Student2Data(var name:String,var age : Int,var sex:Char )

// TODO 92.Kotlin语言的解构声明学习
fun main() {
    val(name,age,sex) = Student1("张三",66,'男')
    println("普通类解构后:name:$name,age:$age,sex:$sex")

    val(name1,age1,sex1) = Student2Data("张三",66,'男')
    println("数据类解构后:name:$name1,age:$age1,sex:$sex1")

    val(_,age2,_) = Student2Data("张三",66,'男')
    println("数据类解构后:age:$age2")
}

9.Kotlin语言的运算符重载学习

class AddClass(number: Int,number2: Int)

//写一个数据类,就是为了,toString打印方便而已哦
data class AddClass2(var number1:Int,var number2: Int){
    operator fun plus(p1:AddClass2) : Int{
        return (number1 + p1.number1) + (number2 + p1.number2)
    }
    //查看整个 KT可以用的 运算符重载方式
    //operator fun AddClass2.
}
// TODO 93.Kotlin语言的运算符重载学习
fun main() {
    //C++语言 +运算符重载就行了  -运算符重载就行了
    //KT语言 plus代表+运算符重载
    println(AddClass2(1,1)+AddClass2(2,2))
}

10.Kotlin语言的枚举类学习

//KT想表达 :枚举其实也是一个class
enum class Week{
    星期一,
    星期二,
    星期三,
    星期四,
    星期五,
    星期六,
    星期日
}
// TODO 94.Kotlin语言的枚举类学习
fun main() {
    println(Week.星期一)
    println(Week.星期日)

    //枚举的值等价于枚举本身
    println(Week.星期六 is Week)
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值