Kotlin语法入门-数据类、伴生类、枚举类(9)

embedded/2024/10/18 14:22:03/

Kotlin语法入门-数据类、伴生类、枚举类(9)

文章目录

  • Kotlin语法入门-数据类、伴生类、枚举类(9)
    • 九、数据类、伴生类、枚举类
      • 1、数据类
      • 2、伴生类
        • 2.1、定义伴生类
        • 2.2、@JvmStatic注解
        • 2.3、const关键字
      • 3、枚举类
        • 3.1、定义
        • 3.2、传参
        • 3.3、继承与实现

九、数据类、伴生类、枚举类

1、数据类

特点:数据类的主构造函数必须要有参数,还有添加data关键字

kotlin">data class A(val name: String, val age: Int) 

使用:其中有个方法叫copy可以进行对象的复制(普通class对象是没有copy方法的)

打印的时候直接使用对象,因为底层实现了**toString()**方法,普通对象使用必须复写toString()方法。

kotlin">fun main() {var a = A("刘德华", 17)var copy = a.copy("李建")println(a) //直接使用对象,因为底层实现了toString()方法println(copy)
}data class A(val name: String, val age: Int){}

运行结果:

image-20240419154635477

通过var copy = a.copy(“李建”)这个函数,进行复制A对象这个数据对象,并且传入值“李建”,但是没有传入age值,这是因为其底层实现将变化的值进行修改,默认值就不变,copy方法实现源码如下:

image-20240419155102368

data class 常用于后端请求的响应之类的,常用于数据模型的使用。

2、伴生类

2.1、定义伴生类

伴生类(companion class)是Kotlin中的一个特殊类,它与普通类不同,可以包含类似Java中的静态成员和方法

在Kotlin中,类不能有静态成员,但是可以使用伴生类来模拟静态成员和方法的行为。伴生类可以访问其所属类的私有成员,并且可以通过类名直接访问其伴生对象的成员。

伴生类的成员可以通过类名直接访问,而不需要创建类的实例

kotlin">fun main() {A.Companion.print()
}class A() {companion object {fun print() {println("A")}}
}

伴生类也支持接口实现,类的继承等。

2.2、@JvmStatic注解
  • @JvmStatic注解用于将伴生对象中的成员标记为静态成员,使得这些成员可以在Java代码中直接通过类名访问,而不需要通过实例化对象来访问。

  • 在Kotlin中,伴生对象的成员默认是在包含伴生对象的类的内部访问的,因此如果想要在Java代码中直接访问伴生对象的成员,就需要使用@JvmStatic注解来标记这些成员。

  • 这样可以更好地与Java代码进行互操作,使得Kotlin代码更加灵活和易于使用。

代码示例:

kotlin代码:

kotlin">fun main() {}class A() {companion object {@JvmStaticfun print1() {println("print1")}fun print2() {println("print2")}}
}

java代码:

public class JavaMain {public static void main(String[] args) {A.Companion.print1();A.print1();A.Companion.print2();}
}

输出,相当远只是不用多写一个Companion

image-20240419162553656

2.3、const关键字
  • 在Kotlin中,const关键字用于声明常量。

  • 在伴生类中,如果想要声明一个常量,可以使用const关键字来修饰伴生对象中的属性。

  • 被const修饰的属性必须是基本数据类型或String类型,并且必须在编译时就能确定其值。

例如:

kotlin">class MyClass {companion object {const val PI = 3.14}
}

在上面的例子中,PI被声明为一个常量,其值为3.14。在使用时,可以通过类名直接访问这个常量,而不需要实例化对象

常量在编译时会被替换为其实际值,因此在运行时不会存在常量的实例。常量的值在编译时就已经确定,不会发生变化。

3、枚举类

3.1、定义

定义与Java没太大区别:

kotlin">fun main() {Test.NAME
}enum class Test {NAME,AGE
}

与Java不一样的地方:

3.2、传参
kotlin">fun main() {println(Test.NAME)println(Test.NAME.value)println(Test.NAME.name)
}enum class Test(val value: String) {NAME("name"),AGE("age")
}

image-20240419165703712

kotlin">fun main() {println(Test.NAME.value)println(Test.AGE.value)
}enum class Test(val value: String="value") {NAME(), //没有值则使用默认值AGE("age")
}
3.3、继承与实现
kotlin">fun main() {Test.NAME.testInterfaceTest()Test.AGE.testInterfaceTest()
}enum class Test() : TestInterface {NAME() {override fun testInterfaceTest() {println("NAME testInterfaceTest...")}},AGE() {override fun testInterfaceTest() {println("AGE testInterfaceTest...")}}
}interface TestInterface {fun testInterfaceTest()
}

image-20240419170203056

可以理解为在一个类A中套用了许多静态类,然后就是调用静态类的过程。

本质上枚举成员是继承自枚举对象的。

当然,Java中也可以随便调用:

image-20240419170707251


http://www.ppmy.cn/embedded/16594.html

相关文章

redis中的双写一致性问题

双写一致性问题 1.先删除缓存或者先修改数据库都可能出现脏数据。 2.删除两次缓存,可以在一定程度上降低脏数据的出现。 3.延时是因为数据库一般采用主从分离,读写分离。延迟一会是让主节点把数据同步到从节点。 1.读写锁保证数据的强一致性 因为一般放…

【Shell】循环结构——for和while循环实例

Shell可以重复地执行特定的指令,直到特定的条件被满足为止。这重复执行的一组指令就叫做循环 特点: 首先,循环条件中使用的变量必须是已初始化的,然后在循环中开始执行每次在循环开始时进行一次测试重复地执行一个代码块 循环实例…

「 网络安全常用术语解读 」SBOM主流格式SPDX详解

SPDX(System Package Data Exchange)格式是一种用于描述软件组件(如源代码)的规范,它提供了一种标准化的方法来描述软件组件的元数据,包括其许可证、依赖项和其他属性。SPDX最初由Linux基金会于2010年发起&…

How to solve matplotlib Chinese garbled characters in Ubuntu 22.04

conda create -n huizhou python3.8conda activate huizhouconda install numpy matplotlibpip install mplfontsmplfonts init# 导入必要的库 import numpy as np import matplotlib.pyplot as plt# 创建角度数组,从0到2π x np.linspace(0, 2 * np.pi, 100)# 计算…

BGP配置和应用案例

策略路由的配置步骤 l 策略路由的配置步骤如下: 创建route-map 通过ACL匹配感兴趣的数据,定义策略动作 在指定接口下通过ip policy 命令应用route-map l 最终实现对通过该接口进入设备的数据进行检查,对匹配的数据执行规定的策略…

【深度学习】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、环境搭建指南二、个性化安装流程三、启动应用四、打开web五、开始训练 19.27服务器 一、环境搭建指南 打造一个高效且友好的开发环境,我们推荐使用以下简洁明了的中文资源: 项目源码获取: 通过以下命令轻松克隆项目及所有子模…

CentOS即将停服,国产化系统替代参考

国产化替代CentOS的产品有多个选择,主要包括以下几种: Alibaba Cloud Linux:阿里云提供的Linux操作系统,旨在为用户提供稳定、安全、高性能的云服务器环境。此外,阿里云还发布了“龙蜥”(Anolis OS&#x…

centos学习-网络配置命令-实用技巧

CentOS网络配置命令详解:轻松掌握网络配置技巧 在CentOS服务器的搭建和管理过程中,网络配置是至关重要的一环。良好的网络配置不仅可以确保服务器的稳定运行,还能够保障网络安全和数据传输效率。本文将详细介绍CentOS网络配置命令&#xff0…