类初始化顺序
constructor 里的参数列表是首先被执行的,紧接着是 init 块和属性初始化器,最后是次构造函数的函数体。
- 主构造函数参数列表
- firstProperty 初始化
- 第一个 init 块
- secondProperty 初始化
- 第二个 init 块
- 次构造函数函数体
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 中,有以下几种主要的类类型:
- 普通类(Regular Class):这是最常见的类类型。可以用 class 关键字来声明这样的类。这种类可以包含构造函数、属性、方法等。例如:class MyClass(var name: String, val age: Int)
- 数据类(Data Class):这类用于存储多种数据类型的数据。它提供了一些内置的方法,如 equals()、hashCode()、toString() 和 copy()。声明一个数据类,需要在前面加上 data 关键字。例如:data class User(val name: String, val age: Int)
- 对象类(Object Class):这是 Kotlin 的一个单例类。一个对象类不能在构造函数中提供任何参数。可以通过 object 关键字创建。例如:object SampleObjectClass
- 枚举类(Enum Class):这是一种特殊的类,用于定义一组命名的常量值。例如:enum class DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
- 密封类(Sealed Class):密封类用于表示受限的类继承结构。一个密封类自身是抽象的,不能直接实例化并且可以有抽象成员。密封类的所有子类必须在该密封类自身定义的文件中声明。例如:sealed class Expr
- 内部类(Inner Class):Kotlin 中的内部类是默认不持有外部类引用的。如果需要访问外部类的成员,需要使用 inner 修饰符。例如:class Outer { inner class Inner }
- 嵌套类(Nested Class):在 Kotlin 中,一个类可以被嵌套在另一个类中,称为嵌套类。例如:class Outer { class Nested }
- 匿名内部类(Anonymous Inner Class):在 Kotlin 中,一般使用对象表达式创建匿名类的对象。例如在监听器的实例化中常用到。
以上就是 Kotlin 中的主要类类型。如果您还有其他关于 Kotlin 或其他 Android 相关的问题,欢迎随时提问。