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

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

文章目录

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

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){}

运行结果:

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

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 {
        @JvmStatic
        fun print1() {
            println("print1")
        }

        fun print2() {
            println("print2")
        }
    }
}

java代码:

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

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

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")
}
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()
}

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

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

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

相关推荐
阿巴斯甜6 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker6 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95277 小时前
Andorid Google 登录接入文档
android
黄林晴8 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab21 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android