写点什么

Kotlin 入门笔记(一)

作者:如浴春风
  • 2022 年 5 月 02 日
  • 本文字数:1864 字

    阅读完需:约 6 分钟

变量

  • 使用 valvar 定义变量

  • val 表示所修饰的变量是不可变的(immutable),一旦赋值不能再重新赋值,类似于 Java 中用 final 修饰变量。

  • var 表示所修饰的变量是可变的,即可以重新赋值

  • 定义变量的形式:val sum: Int = 0,注意变量类型与变量名以冒号(:)分割,并写在冒号后面。

  • 变量默认不能为 null,如要为 null 需在类型后面显式声明

  • val sum: Int?

  • var sum: Int?

  • 使用问号(?)对对象进行判空

  • sum?.toFloat()

函数

  • 通过关键字 fun 生命一个函数,fun myFun(params: String): String {}


条件控制:when/if-else

  • 不超过两种情况,使用 if-else

  • 超过两种以上情况,使用 when

  • 注意:when 表达式的条件必须是完备的。经常配合后面会讲的密封类一起使用。

val msg = when(resultCode) {	OK -> "I'm fine"  Error -> "Encounter a error"  Unknown -> "Something wrong"  else -> "I do not know"}
复制代码

  • 使用关键字 class 定义新的类,使用冒号(:)声明继承关系。如 class A : B,表示创建一个新的类 A,它继承自类(或接口)B

  • 普通类默认不可继承,需要添加关键字 open 才可以。如 open class A。Java 中默认可继承,需要添加关键字 final 才能禁止继承。

  • 【与 Java 一致】抽象类使用关键字 abstract 定义,不可被实例化,能被继承。如 abstract class A

  • 【与 Java 一致】仅能继承一个父类,可以继承多个接口(interface)。

  • 类中的成员(包括方法和属性)默认不可重载,需要显式添加 open 关键字。

  • 成员默认访问属性为 public

  • 成员的初始化顺序按定义顺序,可利用已定义的成员初始化新的成员。

class Base {  val TOTAL = 1024  val SUM = TOTAL / 2 // OK,TOTAL 在 SUM 前面已经定义  // val TT = TEST Error,TEST 在 TT 后面定义  val TEST = 256}
复制代码
  • 如需要在类对象构造时写复杂的逻辑,在 init {} 语句块中实现。

  • 通过 constructor 定义类的构造函数,有主构造函数次构造函数之分。主构造函数出现在函数定义位置,可以省略关键字 constructor

  • 可以且仅可以在主构造函数中,定义类的成员变量。

  • 次构造函数必须调用主构造函数。

class Base { // 这里省略了关键字 consturctor
}
class Parent(private val name: String, private val age: Int) { // 在主构造函数中,定义类的成员变量 constructor(): this("", -1) // 次构造函数定义,必须调用主构造函数,通过关键字 this 实现}
复制代码
  • 支持定义内部类,默认不可访问外部类的成员。如果需要,必须添加关键字 inner 声明。这点与 Java 相反,Java 默认是非静态内部类,默认可访问外部类成员,除非加关键字 static 修饰。

Kotlin 设计这点主要是为了避免 Java 中由内部类使用不当引起的内存泄露问题。

接口

  • 使用关键字 interface 定义接口,如 interface IInterface

  • 接口支持含有默认实现,含有默认实现的方法或属性,子类实现该接口时,可不必实现。

interface IIterface {	val enable: Boolean = false    fun check() {  	if (enable) {    	println("interface enabled")    }  }    fun doSome()}

class Base : IInterface { // 仅需实现 doSome,因为它没有默认实现 // 如果没有必要,可无需实现其他两个成员。 override fun doSome() { // 省略... }}
复制代码

枚举类

  • 通过关键字 enum class 声明一个枚举类。

  • 枚举可以拥有构造参数。

  • 提供了一些内置属性和方法。

  • values() 用于获取所有枚举值。

  • name 属性用于获取枚举的名称(字符串)

  • ordinal 属性获取枚举的位置(从 0 开始)

enum class Status(val code: Int) {	OK(0),  ERROR(1);    fun big(other: Status): Boolean = this.code >= other.code}
fun main() { Status.values().forEach { status -> println("name: ${status.name}, ordinal ${status.ordinal}") println("big then ok? ${status.big(Status.OK)}") }}
复制代码

数据类:data class

类似于 C 语言中的 struct,是一堆数据的集合。此外,还包含一些操作数据的方法。

  • 默认提供了 equals()hashCode()toString()copy() 等方法。

密封类/接口:sealed class/interface

  • 注意与枚举的区别:密封类是子类固定,枚举是对象固定

sealed class Result<out T> {  data class Success<out S>(val data: S) : Result<S>()    data class Error(val exception: Exception) : Result<Nothing>()    data class Loading(    val timestamp: Long = System.currentTimeMillis()  ) : Result<Nothing>()}
复制代码

最佳实践

  • 类中,属性的定义通常放在方法的前面。

  • 尽量使用 data class 封装数据实体。

  • 封装网络请求的状态时,常用密封类。

发布于: 刚刚阅读数: 2
用户头像

如浴春风

关注

还未添加个人签名 2020.02.29 加入

某Top Android手机厂商,相机开发工程师一枚

评论

发布
暂无评论
Kotlin 入门笔记(一)_5月月更_如浴春风_InfoQ写作社区