Kotlin 基本语法5 继承,接口,枚举,密封

news2024/12/28 18:30:56

1.继承与重写的Open关键字

open class Product(
    val name:String
) {

    fun description() = "Product: $name"

   open fun load() = "Nothing .."


}


class LuxuryProduct:Product("Luxury"){//继承需要调用 父类的主构造函数

    override fun load(): String {
        return "LuxuryProduct loading ..."
    }

}

fun main() {
    val p:Product = LuxuryProduct()
    println(p.load())
}

2.类型检测

3.智能类型转化

import java.io.File

open class Product(
    val name:String
) {

    fun description() = "Product: $name"

   open fun load() = "Nothing .."


}


class LuxuryProduct:Product("Luxury"){//继承需要调用 父类的主构造函数

    override fun load(): String {
        return "LuxuryProduct loading ..."
    }
    fun  special():String = "Speical LuxuryProduct Function"

}

fun main() {
    val p:Product = LuxuryProduct()
    println(p.load())

    println(p is Product)
    println(p is LuxuryProduct)
    println(p is File)


    if (p is LuxuryProduct){
        p.special()
    }
}

4. Any 超类

跨平台支持得更好,他的Any类里的 toString hashcode equals 在不同平台有不同的实现,是为了更好的跨平台支持。

5. 对象

 5.1 object关键字 单例模式

object ApplicationConfig{
    var name :String = "singleName"
    init {
        println("ApplicationConfig loading ...")
    }
    fun doSomething(){
        println("doSomething")
    }


}

fun main() {
    //类名,实例名 就是一个单例对象
    ApplicationConfig.doSomething()
    println(ApplicationConfig)
    println(ApplicationConfig)
    println(ApplicationConfig)
    println(ApplicationConfig===ApplicationConfig)
}

5.2  对象表达式 相当于匿名内部类

open class Player{
    open fun load() = "loading nothing"
}

fun main() {
    val p = object : Player(){ //匿名内部类相当于
        override fun load(): String {
            return "anonymous nothing"
        }
    }
    println(p.load())
}

5.3 伴生对象 一个类只能有一个

import java.io.File

open class ConfigMap(val name:String){

    companion object{ //伴生对象  相当于静态内部类 创建的单例对象
        // 不管这个ConfigMap类实例化多少次,这个伴生对象就是单例,因为是不基于对象创建的,是类加载时创建的
        private const val PATH = "XXXX"

        var s:String ="asd"
        fun load() = File(PATH).readBytes()

    }

}

fun main() {
    ConfigMap.load()
}

import java.io.File

open class ConfigMap(val name:String){

    companion object{ //伴生对象  相当于静态内部类 创建的单例对象
        // 不管这个ConfigMap类实例化多少次,这个伴生对象就是单例,因为是不基于对象创建的,是类加载时创建的
        private const val PATH = "XXXX"

        var s:String ="asd"
        fun load() = File(PATH).readBytes()
        init {
            println("companion object 被加载了")
        }

    }

}

fun main() {
    ConfigMap("a")
}

 

6. 嵌套类 实际上就是 静态内部类 

class Player2 {
     class Equipment(var name: String) {
        fun show() = println("equipment:$name")
    }

    fun battle(){

    }


}


fun main() {
    val equipment = Player2.Equipment("sharp knife")


}

 7. 数据类

data class Coordinate(var x: Int, var y: Int) {
    var isInBounds = x > 0 && y > 0

}

fun main() {
    println(Coordinate(10, 20))
    //== 比较的是内容,equals,Any 默认实现 === ,比较引用
    //=== 比较引用


    println(Coordinate(10, 20) == Coordinate(10, 20))
}

 8.copy函数 数据类专属

data class Student (var name:String,val age:Int){
    private val hobby = "music"
    var subject:String

    init {
        println("initializing student")
        subject = "math"
    }
    constructor(_name:String):this(_name,10)

    override fun toString(): String {
        return "Student(name='$name', age=$age, hobby='$hobby', subject='$subject')"
    }
    constructor(_name:String,_age:Int,_hobby:String,_subject:String):this(_name,10){
        subject=_subject
    }


}

fun main() {
    val s = Student("JACK")

    val copy = s.copy(name = "Rose") //copy只跟主构造函数有关

    println(s)
    println(copy)
}

9.结构声明

class PlayerScore(var experience:Int ,val level :Int,val name:String){
    operator fun component1() = experience  //component后面那个数字必须从1开始
    operator fun component2() = name


}

fun main() {
    /**
     * 普通的结构
     */
   val (x,y) = PlayerScore(10,20,"小智")
    println("$x $y")




}
data class PlayerScore(var experience:Int ,val level :Int,val name:String){
    
}

fun main() {
    /**
     * 数据类自带的结构
     */
   val (x,y) = PlayerScore(10,20,"小智")
    println("$x $y")
}

10. 运算符重载

 data class Coordinate(var x: Int, var y: Int) {
    var isInBounds = x > 0 && y > 0

//    operator fun plus(other:Coordinate):Coordinate {
//        return Coordinate(x+other.x,y+other.y)
//    }
    
    operator  fun  plus(other: Coordinate) = Coordinate(x+other.x,y+other.y)

}

fun main() {

    val c1 = Coordinate(10, 20)
    val c2 = Coordinate(10, 20)

    println(c1+c2)
}

11.枚举类

enum class Direction {
    EAST,
    WEST,
    SOUTH,
    NORTH
}

fun main() {
    println(Direction.EAST)
    println(Direction.EAST is Direction)
}

 11.1 枚举类定义函数

enum class Direction (private val coordinate: Coordinate){
    EAST(Coordinate(1,0)),
    WEST(Coordinate(-1,0)),
    SOUTH(Coordinate(0,-1)),
    NORTH(Coordinate(0,1));


    fun updateCoordinate(playerCoordinate: Direction) =
        Coordinate(playerCoordinate.coordinate.x+coordinate.x,
            playerCoordinate.coordinate.y+coordinate.y)

}

fun main() {
    val updateCoordinate = Direction.EAST.updateCoordinate(Direction.WEST)
    println(updateCoordinate)
}

11.2 代数数据类型

enum class LicenseStatus {
    UNQUALIFIED,
    LEARNING,
    QUALIFIED;

}

class Driver(var status: LicenseStatus) {
    fun checkLicense(): String {
        return when (status) {
            LicenseStatus.UNQUALIFIED -> "没资格"
            LicenseStatus.LEARNING -> "在学"
            LicenseStatus.QUALIFIED -> "有资格"
        }
    }

}

fun main() {
    println(Driver(LicenseStatus.LEARNING).checkLicense())
}

 12.密封类

 

//密封
sealed class LicenseStatus2 {
    object UnQualified : LicenseStatus2(){
        val id :String = "2131"
    }
    object Learning : LicenseStatus2()
    class Qualified(val licenseId: String) : LicenseStatus2()

}

class Driver2(var status: LicenseStatus2) {
    fun checkLicense(): String {
        return when (status) {
            is LicenseStatus2.UnQualified -> "没资格 ${(this.status as LicenseStatus2.UnQualified).id}"
            is LicenseStatus2.Learning -> "在学"
            is LicenseStatus2.Qualified -> "有资格,驾驶证编号 ${(this.status as LicenseStatus2.Qualified).licenseId}"
        }
    }

}



fun main() {
    println(Driver2(LicenseStatus2.UnQualified).checkLicense())
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1468312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

热点参数流控(Sentinel)

热点参数流控 热点流控 资源必须使用注解 @SentinelResource编写接口 以及 热点参数流控处理器 /*** 热点流控 必须使用注解 @SentinelResource* @param id* @return*/ @RequestMapping("/getById/{id}") @SentinelResource(value = "getById", blockHand…

《Docker 简易速速上手小册》第3章 Dockerfile 与镜像构建(2024 最新版)

文章目录 3.1 编写 Dockerfile3.1.1 重点基础知识3.1.2 重点案例:创建简单 Python 应用的 Docker 镜像3.1.3 拓展案例 1:Dockerfile 优化3.1.4 拓展案例 2:多阶段构建 3.2 构建流程深入解析3.2.1 重点基础知识3.2.2 重点案例:构建…

外星文明会是朋友还是敌人?科学家用AI模拟揭示惊人答案!

引言:人类与外星文明的潜在互动 自古以来,人类就对外太空充满了好奇与向往,无数科幻作品中都描绘了人类与外星文明的潜在互动。然而,这些互动并非总是和平友好的,正如物理学家Stephen Hawking所警告的,盲目…

2024年全国乙卷高考文科数学备考:历年选择题真题练一练(2014~2023)

今天距离2024年高考还有三个多月的时间,今天我们来看一下2014~2023年全国乙卷高考文科数学的选择题,从过去十年的真题中随机抽取5道题,并且提供解析。后附六分成长独家制作的在线练习集,科学、高效地反复刷这些真题,吃…

小苯的IDE括号问题(CD) -----牛客小白月赛87(双链表)

C题&#xff1a;C-小苯的IDE括号问题&#xff08;easy&#xff09;_牛客小白月赛87 (nowcoder.com) D题&#xff1a; D-小苯的IDE括号问题&#xff08;hard&#xff09;_牛客小白月赛87 (nowcoder.com) C题代码&#xff1a; #include<bits/stdc.h>using namespace std…

HTTP攻击,该怎么防护

一般网络世界里为人们所熟知的DDoS攻击&#xff0c;多数是通过对带宽或网络计算资源的持续、大量消耗&#xff0c;最终导致目标网络与业务的瘫痪&#xff1b;这类DDOS攻击&#xff0c;工作在OSI模型的网络层与传输层&#xff0c;利用协议特点构造恶意的请求载荷来达成目标资源耗…

【Java程序设计】【C00286】基于Springboot的生鲜交易系统(有论文)

基于Springboot的生鲜交易系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的生鲜交易系统 本系统分为系统功能模块、管理员功能模块、用户功能模块以及商家功能模块。 系统功能模块&#xff1a;在系统首页可以…

信号系统之线性图像处理

1 卷积 图像卷积的工作原理与一维卷积相同。例如&#xff0c;图像可以被视为脉冲的总和&#xff0c;即缩放和移位的delta函数。同样&#xff0c;线性系统的特征在于它们如何响应脉冲。也就是说&#xff0c;通过它们的脉冲响应。系统的输出图像等于输入图像与系统脉冲响应的卷积…

125 Linux C++ 系统编程4 Linux 静态库制作,动态库制作,静态库和动态库对比。静态库运行时找不到库的bug fix

一 静态库 和动态库 对比 静态库的原理&#xff1a;假设我们有一个 静态库&#xff0c;大小为500M&#xff0c;这个静态库实现了一些打牌的逻辑算法&#xff0c;提供了一堆API&#xff0c;让开发者 可以轻松的实现 54张扑克牌的随机发牌&#xff0c;指定发牌等功能。 我们写了…

“点击查看显示全文”遇到的超链接默认访问的问题

今天在做一个例子&#xff0c;就是很常见的点击展开全文。 我觉得这是一个很简单的效果&#xff0c;也就几行代码的事&#xff0c;结果点击了以后立刻隐藏不见&#xff0c;控制台代码也不报错&#xff0c;耽误了我很长时间&#xff0c;最后才发现问题出在超链接身上。 “展开全…

搭建私有Git服务器:GitLab部署详解

引言&#xff1a; 为了方便团队协作和代码管理&#xff0c;许多组织选择搭建自己的私有Git服务器。GitLab是一个集成了Git版本控制、项目管理、代码审查等功能的开源平台&#xff0c;是搭建私有Git服务器的理想选择。 目录 引言&#xff1a; 一、准备工作 在开始部署GitLab之…

如何使用 NFTScan NFT API 在 Mantle 网络上开发 Web3 应用

Mantle Network 是建立在以太坊区块链之上的第 2 层扩展解决方案&#xff0c;采用了 Optimistic Rollups 技术&#xff0c;由 BitDAO 孵化&#xff0c;以提供比以太坊更快速和更经济的交易体验。由于 Mantle 基础链构建在 OP Stack 之上并与 EVM 兼容&#xff0c;因此以太坊网络…

使用向量数据库pinecone构建应用03:推荐系统 Recommender Systems

Building Applications with Vector Databases 下面是这门课的学习笔记&#xff1a;https://www.deeplearning.ai/short-courses/building-applications-vector-databases/ Learn to create six exciting applications of vector databases and implement them using Pinecon…

07 STL 简介

目录 什么是STLSTL的版本STL的六大组件STL的重要性如何学习STLSTL的缺陷 1. 什么是STL c标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构和算法的软件框架 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee在惠普实验室的…

postman测试上传文件、导出excel的方法

按照如下操作步骤执行就可以了&#xff1a; 1、PostMan测试接口实现上传文件 第一步&#xff1a; 打开postman&#xff0c;将上传方式改为POST&#xff0c;再点击下【Body】 第二步&#xff1a; 然后&#xff0c;我们点击里面的【form-data】选项(如图所示)。 第三步&#xff…

微服务Day6

文章目录 DSL查询文档RestClient查询文档快速入门 旅游案例 DSL查询文档 RestClient查询文档 快速入门 Testvoid testMatchAll() throws IOException {//1.准备RequestSearchRequest request new SearchRequest("hotel");//2.准备DSLrequest.source().query(QueryB…

医院信息系统(HIS):一文扫盲,算是所有信息系统里面复杂的

大家好&#xff0c;我是贝格前端工场&#xff0c;本期继续分享常见的B端管理系统&#xff0c;欢迎大家关注&#xff0c;如有B端写系统界面的设计和前端需求&#xff0c;可以联络我们。 一、什么是HIS系统 HIS系统&#xff08;Hospital Information System&#xff09;是医院信…

【探索Linux】—— 强大的命令行工具 P.23(线程池 —— 简单模拟)

阅读导航 引言一、线程池简单介绍二、Linux下线程池代码⭕Makefile文件⭕ . h 头文件✅Task.hpp✅thread.hpp✅threadPool.hpp ⭕ . cpp 文件✅testMain.cpp 三、线程池的优点温馨提示 引言 在Linux下&#xff0c;线程池是一种常见的并发编程模型&#xff0c;它能够有效地管理…

C++ Primer Plus 笔记(持续更新)

编译器的正解 数据&#xff0b;算法程序 赋值从右向左进行 cin&#xff0c;cout的本质也是对象 类和对象的解释

扫盲贴:Svg动画和Canvas动画有什么区别

hello&#xff0c;我是贝格前端工场&#xff0c;网页中动画的实现有N种方式&#xff0c;比如css动画&#xff0c;js动画&#xff0c;svg动画&#xff0c;canvas动画等等&#xff0c;每一种动画都有对应的场景&#xff0c;本问重点介绍一下svg和canvas动画的异同点&#xff0c;欢…