Kotlin中的类

发布于:2024-07-02 ⋅ 阅读:(10) ⋅ 点赞:(0)

类初始化顺序

constructor 里的参数列表是首先被执行的,紧接着是 init 块和属性初始化器,最后是次构造函数的函数体。

  1. 主构造函数参数列表
  2. firstProperty 初始化
  3. 第一个 init 块
  4. secondProperty 初始化
  5. 第二个 init 块
  6. 次构造函数函数体
class Example constructor(param: String) {
    val firstProperty = "First property: $param".also(::println)

    init {
        println("First initializer block that prints $param")
    }

    val secondProperty = "Second property: ${param.length}".also(::println)

    init {
        println("Second initializer block that prints ${param.length}")
    }

    constructor(param: String, secondParam: Int) : this(param) {
        println("Secondary constructor")
    }
}

静态类

2种静态类, 一种伴生类, 一种独立类
通过伴生类实现单例模式, 每个类伴生类只允许一个, 伴生类的名字可有可无

   class UserManager private constructor(var name: String) {
        init {
            print("test == $name")
        }

        constructor(name: String, age: Int) : this(name) {
        }

        constructor(name: String, age: Int, moreInfo: String) : this(name) {

        }

        override fun toString(): String {
            return name
        }

        companion object {
            val instance = UserManager("defaultName");
            fun getInstance(): UserManager {
                return instance
            }
        }
    }

通过独立类实现工具类

    object LogUtil {

        private val TAG = LogUtil.javaClass.simpleName.toString()
        fun log(ss: String): Unit {
            Log.e(TAG, ss)
        }
    }

数据类

  • data class 必须至少有一个参数。
  • 所有的主构造函数参数需要被标记为 val 或 var。
  • 数据类不能是抽象的、开放的(open)、密封的(sealed) 或者内部的(inner)
    可以使用网站生成数据类

https://transform.tools/json-to-kotlin
以下是两种生成的例子, Kotlin对下划线命名有警告, 所以自己不会生成下划线的名字, 使用注解的时候需要第三方库
implementation ‘com.fasterxml.jackson.core:jackson-annotations:2.11.2’

    data class Root(
        val userId: Long,
        val id: Long,
        val title: String,
        val completed: Boolean,
    )

    data class Root2(
        @JsonProperty("device_brand")
        val deviceBrand: String,
        @JsonProperty("device_id")
        val deviceId: String,
        @JsonProperty("device_number")
        val deviceNumber: String,
        val googleAdId: String,
        @JsonProperty("main_package_id")
        val mainPackageId: Long,
        val os: String,
        val page: Long,
        val query: String,
        val refresh: Boolean,
    )

Kotlin中所有类的类型

在 Kotlin 中,有以下几种主要的类类型:

  1. 普通类(Regular Class):这是最常见的类类型。可以用 class 关键字来声明这样的类。这种类可以包含构造函数、属性、方法等。例如:class MyClass(var name: String, val age: Int)
  2. 数据类(Data Class):这类用于存储多种数据类型的数据。它提供了一些内置的方法,如 equals()、hashCode()、toString() 和 copy()。声明一个数据类,需要在前面加上 data 关键字。例如:data class User(val name: String, val age: Int)
  3. 对象类(Object Class):这是 Kotlin 的一个单例类。一个对象类不能在构造函数中提供任何参数。可以通过 object 关键字创建。例如:object SampleObjectClass
  4. 枚举类(Enum Class):这是一种特殊的类,用于定义一组命名的常量值。例如:enum class DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
  5. 密封类(Sealed Class):密封类用于表示受限的类继承结构。一个密封类自身是抽象的,不能直接实例化并且可以有抽象成员。密封类的所有子类必须在该密封类自身定义的文件中声明。例如:sealed class Expr
  6. 内部类(Inner Class):Kotlin 中的内部类是默认不持有外部类引用的。如果需要访问外部类的成员,需要使用 inner 修饰符。例如:class Outer { inner class Inner }
  7. 嵌套类(Nested Class):在 Kotlin 中,一个类可以被嵌套在另一个类中,称为嵌套类。例如:class Outer { class Nested }
  8. 匿名内部类(Anonymous Inner Class):在 Kotlin 中,一般使用对象表达式创建匿名类的对象。例如在监听器的实例化中常用到。

以上就是 Kotlin 中的主要类类型。如果您还有其他关于 Kotlin 或其他 Android 相关的问题,欢迎随时提问。