Kotlin学习笔记 -- 与 Java 写法区别

笔记内容来自 扔物线 的 https://kaixue.io/kotlin-basic-2/

constructor

构造函数

  • Java 中构造器和类同名,Kotlin 中使用 constructor 表示。
  • Kotlin 中构造器没有 public 修饰,因为默认可见性就是公开的

init

Kotlin 的 init 代码块和 Java 一样,都在实例化时执行,并且执行顺序都在构造器之前。

  • Java 用 {} 表示 init 代码块
  • Kotlin 用 init 关键字

final

语言关键字是否是默认值
Javafinal非默认
Kotlinval默认。这样设计的原因是保证了参数不会被修改

object

object 不是类,像 class 一样在 Kotlin 中属于关键字,意思是对象。

用 object 修饰的对象中的变量和函数都是静态的

object Sample {
   val name = "A name"
}

上述代码含义,创建一个类,并创建一个这个类的对象。

在代码中如果要使用这个对象,直接通过它的类名就可以访问:
Sample.name

1、用 object 可以实现单例模式,且线程安全

// ? class 替换成了 object
object A {
    val number: Int = 1
    fun method() {
        println("A.method()")
    }
}   

2、用 object 创建匿名类

val listener = object: ViewPager.SimpleOnPageChangeListener() {
    override fun onPageSelected(position: Int) {
        // override
    }
}

companion object

companion 可以理解为伴随、伴生,表示修饰的对象和外部类绑定。

Java 静态变量和方法的等价写法:companion object 变量和函数

class A {
    companion object {
        var c: Int = 0
    }
}

直接调用 A.c

top-level property / function 声明

把属性和函数的声明不写在 class 里面。

这样写的属性和函数,不属于任何 class,而是直接属于 package。

package com.hencoder.plus
​
// ? 属于 package,不在 class/object 内
fun topLevelFuncion() {
}

调用的时候:

import com.hencoder.plus.topLevelFunction // ? 直接 import 函数
​
topLevelFunction()

在实际使用中,在 object、companion object 和 top-level 中该选择哪一个?

  • 如果想写工具类的功能,直接创建文件,写 top-level「顶层」函数。
  • 如果需要继承别的类或者实现接口,就用 object 或 companion object。

常量

Kotlin 中只有基本类型和 String 类型可以声明成常量。

语言关键字示例
Javastatic finalpublic static final int CONST_NUMBER = 1;
Kotlinconstconst val CONST_SECOND_NUMBER = 2

集合

语言类型含义
Java/KotlinList以固定顺序存储一组元素,元素可以重复
Java/KotlinSet存储一组互不相等的元素,通常没有固定顺序
Java/KotlinMap存储 键-值 对的数据集合,键互不相等,但不同的键可以对应相同的值

List 集合的创建

  • Java
List<String> strList = new ArrayList<>();
strList.add("a");
strList.add("b");
strList.add("c"); // ? 添加元素繁琐
  • Kotlin
val strList = listOf("a", "b", "c")

Set 集合的创建

  • Java
Set<String> strSet = new HashSet<>();
strSet.add("a");
strSet.add("b");
strSet.add("c");
  • Kotlin
val strSet = setOf("a", "b", "c")

Map 集合的创建

  • Java
Map<String, Integer> map = new HashMap<>();
map.put("key1", 1);
map.put("key2", 2);
map.put("key3", 3);
map.put("key4", 3);
  • Kotlin
val map = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 3)

mapOf 的每个参数表示一个键值对,to 表示将「键」和「值」关联

可变集合/不可变集合

Kotlin 中不可变(只读)集合:集合的 size 不可变、集合中的元素值不可变

类型是否可变函数转换为可变转换为可变的备注
List不可变listOf()toMutableList()返回的是一个新建的集合
List可变mutableListOf()
Set不可变setOf()toMutableSet()返回的是一个新建的集合
Set可变mutableSetOf()
Map不可变mapOf()toMutableMap()返回的是一个新建的集合
Map可变mutableMapOf()

mutable 前缀的函数创建的是可变的集合,没有 mutbale 前缀的创建的是不可变的集合(可以通过 toMutable*() 变成可变集合,但生成的是一个新的集合)。

可见性修饰符

修饰符描述
public公开,可见性最大,哪里都可以引用
private私有,可见性最小,根据声明位置不同可分为类中可见和文件中可见
protected私有,可见性最小,根据声明位置不同可分为类中可见和文件中可见
internal内部,仅对 module 内可见

版权声明:本文为qq_33703877原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。