Posts /

Kotlin 学习记录(常变量、数据类型)

15 Jul 2019

Kotlin 学习记录


本文只记录重要的或者与C/C++、Java 出入较大的内容

Kotlin 变、常量用法

  1. 在类中定义变量必须初始化,暂时不能初始化的可用lateinit[后期初始化]关键字声明
  2. lateinit只能声明于 var 变量(不能为可空变量、不能为基本数据类型、使用变量前必须赋值)
  3. 延后初始化。只能用于只读变量。
// 声明一个延迟初始化的字符串数组变量
private val mTitles : Array<String> by lazy {
arrayOf(
        ctx.getString(R.string.tab_title_android),
        ctx.getString(R.string.tab_title_ios),
        ctx.getString(R.string.tab_title_h5)
)
}

// 声明一个延迟初始化的字符串
private val mStr : String by lazy{
"我是延迟初始化字符串变量"
}
  1. val 不是常量,是不可修改的变量。常量为 const val 且 const 不能用于修饰var
  2. 常量声明的三种正确方式
// 1. 顶层声明
const val NUM_A : String = "顶层声明"

// 2. 在object修饰的类中
object TestConst{
    const val NUM_B = "object修饰的类中"
}

// 3. 伴生对象中
class TestClass{
    companion object {
        const val NUM_C = "伴生对象中声明"
    }
}

fun main(args: Array<String>) {
    println("NUM_A => $NUM_A")
    println("NUM_B => ${TestConst.NUM_B}")
    println("NUM_C => ${TestClass.NUM_C}")
}常量声明的三种正确方式

数据类型

  1. Kotlin当中不支持8进制
var num16 = 0x0F
var num2 = 0b11110001
var num10 = 123
  1. Kotlin中可以通过下划线作数值中的逗号
var oneMillion = 1_000_000
println("var oneMillion = 1_000_000 => var oneMillion = $oneMillion")
  1. 数值比较:== 比较值,===比较内存中的地址
  2. 位运算大有不同:
    var operaNum = 2

    var shlnum = operaNum shl(2)
    var shrnum = operaNum shr(2)
    var ushrnum = operaNum ushr(2)

    println(" shlOperaNum => $shlnum \n" +
            " shrOperaNum => $shrnum \n" +
            " ushrOperaNum => $ushrnum \n " )

Kotlin中对于按位操作,和Java是有很大的差别的。Kotlin中没有特殊的字符,但是只能命名为可以以中缀形式调用的函数,下列是按位操作的完整列表(仅适用于整形(Int)和长整形(Long)):

  • shl(bits) => 有符号向左移 (类似Java<<)
  • shr(bits) => 有符号向右移 (类似Java>>)
  • ushr(bits) => 无符号向右移 (类似Java>>>)
  • and(bits) => 位运算符 and (同Java中的按位与)
  • or(bits) => 位运算符 or (同Java中的按位或)
  • xor(bits) => 位运算符 xor (同Java中的按位异或)
  • inv() => 位运算符 按位取反 (同Java中的按位取反)
  1. 数组分 arrayOf(), arrayOfNulls(), Array(), 原始类型数组