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

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.Fileopen 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.Fileopen 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.Fileopen 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:Stringinit {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.hqwc.cn/news/480184.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis | 初识Mybatis

初识Mybatis 目录: 初识Mybatis什么是Mybatis?Hibernate 和 MyBatis的区别?Mybatis的下载和使用Mybatis的工作原理 作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习&#…

从宏观到微观——泽攸科技ZEM系列台式扫描电子显微镜在岩石分析中的应用

岩石作为地球地壳的主要构成物质之一,其微观结构对于了解地质过程、资源勘探以及工程建设具有重要意义。按照岩石的成因,可以把它们分为三类:岩浆岩、沉积岩和变质岩。在地球表面,沉积岩占据75%的份额,而在地壳深度&am…

卡车拆解不再难:可视化示意图的魔力

随着科技的飞速发展和工业的不断进步,卡车作为物流运输的核心力量,承担着越来越多的运输任务。然而,当卡车出现故障或需要维护时,复杂的拆解流程往往让人头疼不已。这时,一份清晰易懂的卡车拆解示意图就显得尤为重要。…

解决本地googleapis 谷歌统计 nodejs 遇到 ECONNRESET和 ETIMEDOUT

在本地通过谷歌分析接口, 获取网站的访问量统计, 用于在管理端面板世界地图显示 获取分析数据的部分代码,这部分很简单示例有 // 获得前10个页面浏览量与页面标题在过去30天 const {BetaAnalyticsDataClient} require(google-analytics/data); const analyticsDataClient ne…

Linux 内存top命令详解

通过top命令可以监控当前机器的内存实时使用情况,该命令的参数解释如下: 第一行 15:30:14 —— 当前系统时间 up 1167 days, 5:02 —— 系统已经运行的时长,格式为时:分 1 users ——当前有1个用户登录系统 load average: 0.00, 0.01, 0.05…

数组的左旋和右旋算法

public class Test09 {public static void main(String[] args) {//右旋 数组逆序遍历,将尾部元素,不断交换至头部int[] arr {1,2,3,4,5,6,7,8};for(int i arr.length-1;i>0;i--) { //遍历一次arr[i] arr[i] ^ arr[i-1];arr[i-1] arr[i] ^ arr[i…

SpringCloud-基于Feign远程调用

Spring Cloud 是一个用于构建分布式系统的开发工具包,它提供了一系列的微服务组件,其中之一就是 Feign。Feign 是一种声明式的 Web 服务客户端,它简化了在 Spring Cloud 中进行远程调用的过程。本文将介绍如何在 Spring Cloud 中使用 Feign 进…

Security6.2 中的SpEL 表达式应用(权限注解使用)

最近学习若依框架,里面的权限注解涉及到了SpEL表达式 PreAuthorize("ss.hasPermi(system:user:list)"),若依项目中用的是自己写的方法进行权限处理, 也可以只用security 来实现权限逻辑代码,下面写如何用security 实现。…

回显服务器

. 写一个应用程序,让这个程序可以使用网络通信,这里就需要调用传输层提供的api,传输层提供协议,主要是两个: UDP,TCP,它们分别提供了一套不同的api,socket api. UDP和TCP UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字节流,全双工 一个客户端可以连接…

JZ65 不用加减乘除做加法(,^)

一&#xff1a;题目 二&#xff1a;思路 三&#xff1a;代码 int Add(int num1, int num2 ) {//ab (a ^ b)(a&b<<1)//num2 0 时表示没有进位了while(num2){int tmp num1;//得到不进位的数据num1 num2 ^ tmp;//得到进位的数据num2 (tmp&num2)<<1;}ret…

docker 启动镜像命令

Docker 的启动命令用于启动 Docker 容器。这些命令可以从基本的 docker run 命令扩展到包括多个选项和参数&#xff0c;以满足不同的需求。以下是一些常用的 Docker 启动命令和选项的示例&#xff1a; 启动一个新容器&#xff1a; docker run [OPTIONS] IMAGE [COMMAND] [ARG..…

已解决Application run failed org.springframework.beans.factory.BeanNot

问题原因&#xff1a;SpringBoot的版本与mybiats-puls版本不对应且&#xff0c;spring自带的mybiats与mybiats-puls版本不对应 这里我用的是3.2.2版本的SpringBoot&#xff0c;之前mybiats-puls版本是3.5.3.1有所不同。 问题&#xff1a;版本对不上 解决办法&#xff1a;完整…