Kotlin中嵌套类、数据类、枚举类和密封类的详解

news2024/11/26 14:28:59

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家
👉点击跳转到教程

一、嵌套类

如果一个类只对另一个类有用,那么将其嵌入到该类中并使这两个类保持在一起是合乎逻辑的,可以使用

class Player2 {
    /**
     * 嵌套类
     * 如果一个类只对另一个类有用,那么将其嵌入到该类中并使这两个类保持在一起是合乎逻辑的,可以使用
     * 嵌套类。
     */
    class Equipment(var name: String) {
        fun show() = println("equipment:$name")
    }

    fun battle() {

    }
}

fun main() {
    Player2.Equipment("sharp knife").show()
}

输出结果如下

equipment:sharp knife

二、数据类

/**
 * 数据类
 * 数据类,是专门设计用来存储数据的类
 * 数据类提供了toString的个性化实现
 * ==符号默认情况下,比较对象就是比较它们的引用值,数据类提供了equals和hashCode
 * 的个性化实现。
 */
data class Coordinate(var x: Int, var y: Int, val z: Int) {
    val isInBounds = x > 0 && y > 0
}

fun main() {
    println(Coordinate(10, 20, 30))
    //== 比较的是内容  equals 默认使用的超类Any的实现 === 比较的是引用
    // === 比较的是对象的引用
    println(Coordinate(10, 20, 30) == Coordinate(10, 20, 30))
    val (x, y, z) = Coordinate(10, 20, 30)
    println("$x,$y,$z")
}

输出结果如下

Coordinate(x=10, y=20, z=30)
true
10,20,30

三、数据类中的copy函数

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

    init {
        println("initializing student")
        subject = "math"
    }

    constructor(_name: String) : this(_name, 10) {
        score = 10
    }

    override fun toString(): String {
        return "Student(name='$name', age=$age, hobby='$hobby', subject='$subject', score=$score)"
    }

}

fun main() {
    val student = Student("jack")

    /**
     * copy
     * 除了重写Any类的部分函数,提供更好用的默认实现外,数据类还提供了一个函数,它可以用来
     * 方便地复制一个对象。假设你想创建一个Student实例,除了name属性,它拥有和另一个现有Student实例完全一样
     * 的属性值,如果Student是个数据类,那么复制现有Student实例就很简单了,只要调用copy函数,给想修改的属性
     * 传入值参就可以了。
     */
    var copyStudent = student.copy("Rose")
    println(student)
    println(copyStudent)
}

输出结果如下

initializing student
initializing student
Student(name='jack', age=10, hobby='music', subject='math', score=10)
Student(name='Rose', age=10, hobby='music', subject='math', score=0)

四、数据类中的解构声明

class PlayerScore(val experience: Int, val level: Int) {
    /**
     * 解构声明
     * 解构声明的后台实现就是component1、component2等若干个组件函数
     * 让每个函数负责管理你想返回的一个属性数据,如果你定义一个数据类,
     * 它会自动为所有定义在主构造函数的属性添加对应的组件函数。
     */
    operator fun component1() = experience
    operator fun component2() = level
}

fun main() {
    val (x, y) = PlayerScore(10, 20)
    println("$x $y")
}

输出结果如下

10 20

创建一个数据类看一下效果

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

fun main() {
    println(Coordinate(10, 20, 30))
    //== 比较的是内容  equals 默认使用的超类Any的实现 === 比较的是引用
    // === 比较的是对象的引用
    println(Coordinate(10, 20, 30) == Coordinate(10, 20, 30))
    val (x, y, z) = Coordinate(10, 20, 30)
    println("$x,$y,$z")
}

输出结果

Coordinate(x=10, y=20, z=30)
true
10,20,30

五、数据类中的运算符重载

在这里插入图片描述

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

    /**
     * 运算符重载
     * 如果要将内置运算符应用在自定义类身上,你必须重写运算符函数,告诉编译器该如何操作自定义类。
     */
    /**
     * plus函数名 对应的操作符为+
     * 把一个对象添加到另一个对象里。
     */
    operator fun plus(other: Coordinate2) = Coordinate2(x + other.x, y + other.y)
}

fun main() {
    val c1 = Coordinate2(10, 20)
    val c2 = Coordinate2(10, 20)
    println(c1 + c2)
}

输出结果如下

Coordinate2(x=20, y=40)

六、枚举类

/**
 * 枚举类
 * 枚举类,用来定义常量集合的一种特殊类。
 */
enum class Direction {
    EAST,
    WEST,
    SOUTH,
    NORTH
}

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

输出结果如下

EAST
true

七、枚举类中定义函数

/**
 * 枚举类
 * 枚举类,用来定义常量集合的一种特殊类。
 */
enum class Direction2(private val coordinate2: Coordinate2) {
    EAST(Coordinate2(10, 20)),
    WEST(Coordinate2(11, 21)),
    SOUTH(Coordinate2(12, 22)),
    NORTH(Coordinate2(13, 23));

    /**
     * 枚举类也可以定义函数
     */
    fun updateCoordinate2(playerCoordinate: Coordinate2) = Coordinate2(playerCoordinate.x + coordinate2.x, playerCoordinate.y + coordinate2.y)
}

fun main() {
    println(Direction2.EAST.updateCoordinate2(Coordinate2(10, 20)))
}

输出结果

Coordinate2(x=20, y=40)

八、代数数据类型

/**
 * 代数数据类型
 * 可以用来表示一组子类型的闭集,枚举类就是一种简单的ADT(抽象数据类型)
 */
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.QUALIFIED).checkLicense())
}

输出结果如下

有资格

九、密封类的详解

/**
 * 密封类
 * 对于更复杂的ADT(抽象数据类型),你可以使用kotlin的密封类(sealed class)来实现更复杂的定义
 * 密封类可以用来定义一个类似于枚举类的ADT,但你可以更灵活地控制某个子类型。
 * 密封类可以有若干个子类,要继承密封类,这些子类必须和它定义在同一个文件里。
 */
sealed class LicenseStatus2 {
    object UNQUALIFIED : LicenseStatus2()
    object LEARNING : LicenseStatus2()
    class QUALIFIED(val licenseId: String) : LicenseStatus2()
}

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

fun main() {
    val status = LicenseStatus2.LEARNING
    val driver2 = Driver2(status)
    println(driver2.checkLicense())
    
    val status1 = LicenseStatus2.QUALIFIED("809987")
    val driver = Driver2(status1)
    println(driver.checkLicense())
}

输出结果如下

在学
有资格,驾驶证编号:809987

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

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

相关文章

【Deepstream学习】TX1 跑demo

大家好,我是虎哥,使用NVIDIA Jeston TX1 也有很长一段时间了,由于这是基本停产的一个模块,其实自己也担心有很多官方的demo无法适配跑起来了,所以花了点时间,进一步研究发挥其GPU性能,使用各种硬…

STM8S207时钟管理库函数

STM8S207时钟树 //STM8S207时钟管理库函数 //CLK_DeInit();//将相关的时钟寄存器恢复到默认值 //CLK_HSECmd(ENABLE);//启用外部高速振荡器HSE //CLK_HSECmd(DISABLE);//关闭外部高速振荡器HSE //CLK_HSICmd(ENABLE);//启用内部高速振荡器HSI //CLK_HSICmd(DISABLE)//关闭内部高…

Spring Cloud Sentinel(限流、熔断、降级)、SpringBoot整合Sentinel、Sentinel的使用-60

一:Sentinel简介 Sentinel就是分布式系统的流量防卫兵 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 1.1 官方文档 官方文档&#…

哪里可以找到电子版的大学课本?

第一个:中国高校课件下载网站网址:http://download.cucdc.com/这是一个可以下载各个大学课本的网站,基本上所有的大学课本都能在这里找到PDF版本。可以按学校学科搜。 第二个:淘链客网址:https://www.toplinks.cc/s/PD…

MySQL_存储引擎

存储引擎 MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口&…

读书:《如何想到又做到》

全书最有用的内容是下面这张图:持久改变的SCIENCE模型。 作者为了方便读者记忆,找了7个单词,首字母拼在一起就是SCIENCE,对应着7种武器: S 阶梯(Stepladders):小而又小的迭代 C 社群…

高性能零售IT系统的建设09-Spring Boot2.4.2+Spring Cloud+Nacos+Feign+Hystrix的生产级应用实例

开篇 通过前面8篇我们已经感受到了我接手时这个项目有多“烂”,当然喽如果只是一味的承认它的烂这不是积极乐观主义。 我在接触管理早期听过一次四大厂的报告,报告中说到:从来没有屎一样的团队只有屎一样的“带队”。 这也符合我们一直接受的…

SpringMVC @RequestHeader @CookieValue 处理获取请求参数的乱码问题

SpringMVC RequestHeader CookieValue 处理获取请求参数的乱码问题RequestHeaderCookieValue什么是cookie通过POJO获取请求参数通过CharacterEncodingFilter处理获取请求参数的乱码问题get请求的乱码post请求乱码处理获取请求参数的乱码问题)RequestHeader 1.RequestHeader是将…

实时计算业务介绍实时日志分析

4.1 实时计算业务介绍 学习目标 目标 了解实时计算的业务需求知道实时计算的作用应用 无 4.1.1 实时计算业务需求 实时(在线)计算: 解决用户冷启动问题实时计算能够根据用户的点击实时反馈,快速跟踪用户的喜好 4.1.2 实时计算…

编译与优化

第10章 前端编译与优化 10.2.1 Javac的源码与调试 从Javac代码的总体结构来看,编译过程大致可以分为1个准备过程和3个处理过程,它们分别如下 所示。 1)准备过程:初始化插入式注解处理器。 2)解析与填充符号表过程&…

【C++】异常

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉C语言传统…

精神财富 物质财富

今天聊到别的家庭每天都制定好计划的,补习班 party 冬令营什么之类的,这个是我们达不到的。有人提前开启了认知,赚到了人生的第一桶金。懂得付出,和执行输出差了好多数量级。 今天看了杂技表演,男人和女人配合的好好 …

C++ 初阶 :stackqueue

文章目录1 stack的介绍2 stack的模拟实现3 queue的介绍4 queue的模拟实现5 priority_queue(优先级队列)介绍6 priority_queue 模拟实现7 仿函数8 deque的简单介绍8.1 deque与vector list的比较8.2 为什么选择deque作为stack和queue的底层默认容器1 stack的介绍 ①stack是一种容…

Springboot校园食堂外卖点餐系统357

目 录 1 概述 1 1.1课题背景及意义 1 1.2 国内外研究现状 1 1.3 本课题主要工作 2 2 系统开发环境 3 2.1 java简介 3 2.2 Mysql数据库 3 2.3 B/S结构 4 2.4 JSP技术介绍 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2操作…

javaEE 初阶 — Socket 套接字与 UDP 数据报套接字编程

文章目录1. Socket 套接字1.1 有连接与无连接1.2 可靠与不可靠传输1.3 面向字节流与面向数据报1.4 全双工与半双工2. UDP数据报套接字编程2.1 DatagramSocket API2.2 DatagramPacket API2.3 InetSocketAddress API3. UDP 版本的客户端服务器程序3.1 服务器实现3.2 客户端实现3.…

【JUC并发编程】Java内存模型——JMM

【JUC并发编程】Java内存模型——JMM详解 文章目录【JUC并发编程】Java内存模型——JMM详解一:并发编程模型的两个关键问题二:Java内存模型的抽象结构1:从 CPU 缓存模型说起2:JMM3:JMM与Java内存区域划分的区别与联系4…

(考研湖科大教书匠计算机网络)第三章数据链路层-第二节:封装成帧

专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:封装成帧概述二:封装成帧作用(1)帧定界A:概述B:注意(2)透明传输A:字符填充B&…

设置Linux的信任列表

前言 我们在使用普通用户的时候,我们可以对指令提权,需要用到sudo指令,但是我们在使用的时候会报错。 原因就是,我们linux系统不信任你,必须将你放到我们的信任列表中,我们就可以使用我们的指令提权。 下图是我们在不是…

数据库系统概论②——关系数据库基础

本篇文章主要讲解关系数据库基础中的基本概念,包括关系模型概述、关系的完整性约束等等内容。 同时想要了解更多数据库系统概论知识的朋友可以看下我的上一篇文章数据库系统概论①——数据库系统基本概念 文章目录1、关系数据库的基本概念1.1 关系模型概述1.2 关系数…

【26】C语言_数据存储

目录 数据类型的意义 大小端介绍 例题1:设计一个小程序输出存储方式: 例题2:下列程序输出什么,为什么 例题3:下列程序输出什么,为什么 例题4:下列程序输出什么,为什么 例题6&a…