前言
类的形式
普通类
1 | class ResultVo<T> { |
数据类(pojo)
1 | data class Customer(val name: String, val email: String) |
自动添加的方法:
- 为所有属性添加
getters
,如果为var
类型同时添加setters
- equals()
- haseCode()
- toString()
- copy()
限制
data class
有一些特殊限制:
- 主构造函数至少需要一个参数
- 主构造函数的参数必须是
val
或var
(不能是无修饰符的参数) - 不能是抽象类、密封类、内部类或枚举类
数据类以及解构声明
组件函数允许数据类在解构声明中使用:
1 | val jane = User("Jane", 35) |
枚举
1 | enum class Color(val rgb: Int) { |
密封类
密封类(Sealed Class)是一种特殊的类,用于表示受限的类层次结构,它的子类是固定的,不能在定义密封类的文件外部添加新的子类。
这种特性使得密封类非常适合用于表示固定的状态集合或结果类型。
1 | // 密封类定义所有可能的请求状态 |
与其他类型的对比
类型 | 特点 | 适用场景 |
---|---|---|
密封类 | 子类固定,可携带数据,灵活 | 复杂状态管理(如 UI 状态、请求结果) |
枚举(enum) | 实例固定,不可携带动态数据 | 简单的标签式状态(如颜色、类型) |
普通类 | 可自由继承,无限制 | 需要灵活扩展的类层次结构 |
可见修饰符
- private:同一类或文件(针对包级别定义)中可见
- protected:同private 加子类可见
- internal:在同一个模块中可见(如果声明范围的所有者是可见的)
- public:公共,所有都可见
单例
1 | object MyClass{ |
那么MyClass.aa()
其实就是调用单例的aa方法
继承
open
关键字用于声明一个可以被继承或者被子类重写的类、方法或者属性。
Kotlin 中的类、方法、属性默认是不可继承或重写的,如果你希望某个类可以被其他类继承,或者某个方法或属性可以在子类中被重新实现,就需要使用 open
关键字来进行声明。
自定义组件
1 | open class SpliterLinearLayout : LinearLayoutCompat { |
类扩展
1 | fun <T> MutableList<T>.swap(x: Int, y: Int) { |
调用方式
1 | val list = mutableListOf(1, 2, 3) |
扩展是被
静态解析
的
延迟初始化
在 Kotlin 中,lateinit
关键字用于延迟初始化属性,即在声明属性时不需要立即赋初始值,而是在后续的某个时间点再进行赋值。
lateinit
只能用于非空类型的属性,并且必须是类属性(不能是局部变量)。
下面是一个简单的示例,演示了如何在 Kotlin 中使用 lateinit
:
1 | class Example { |
在这个示例中,name
属性被标记为 lateinit
,在 initializeName()
方法中对其进行了初始化,然后在 printName()
方法中检查是否已经被初始化并打印其值。
需要注意的是,如果在访问一个未被初始化的 lateinit
属性时,会抛出 UninitializedPropertyAccessException
异常,因此在访问之前必顋确保已经对其进行了初始化。
类对比
Java
1 | Intent t = new Intent(); |
Kotlin
1 | val t = Intent() |
接口写法对比
Java
1 | OkGo.<TUserBean>post("") |
Kotlin
1 | OkGo.post<TUserBean>("") |
静态属性和方法
Kotlin中定义
1 | class ApiModel { |
Kotlin中调用
1 | ApiModel.baseUrl |
Java中调用
1 | ApiModel.Companion.getBaseUrl(); |
所以建议静态属性和方法建议还用
Java
来写
类转换
1 | activity as ClassActivity |