【1、Kotlin 基础语法】2、Kotlin 变量
1、注释
- Kotlin每行语句可以加分号,也可以不加分号
- Kotlin有三种注释:类注释/方法注释、单行注释、多行注释(可以嵌套)
/*** 类注释、方法注释*/
fun main(args: Array<String>) {// 单行注释println("Hello World!");/*多行注释*/println("Program arguments: ${args.joinToString()}")/*第一层块注释/*第二层块注释/*第三层快注释这种注释方式在java中是不支持的,但是在kotlin中是支持的。算是一个亮点吧(貌似意义不大)。*/*/*/println("123")
}
2、变量
- Kotlin中一切都是对象,都是引用类型,没有像Java的基本数据类型,但是最终编译器会生成基本数据类型
2-1、变量定义
- 声明变量类型 + 初始化赋值
fun main(args: Array<String>) {// 显式指定变量类型var num1 : Int = 12// 不指定变量类型,编译器会自动进行类型推导var num2 = 23// 先声明类型再初始化var num3 : Intnum3 = 20println(num3)// 报错,变量必须被指定类型或者初始化// This variable must either have a type annotation or be initializedvar num4;// 此句会报错var num5 : Int// 报错,仅仅声明类型,没有初始化,编译器也会报错,Variable 'num5' must be initializedprintln(num5)
}
2-2、类型推导
- 声明时数据类型和初始化至少给定一个,或者两者都声明,否则编译器报错
// 仅初始化,类型推导
var a = "aaaa"
val b = true// 仅声明类型
var c:String
val d:Int// 类型和初始化都声明
var e : Int = 12
val f : String = "abc"// 以下代码会编译报错 This variable must either have a type annotation or be initialized
var g
g = 12
val h
h = 12// 这里不报错
var g : String
// 报错 Variable 'g' must be initialized
println(g)
2-3、var可变变量 vs val不可变变量
- var(来自variable),可变引用。这种变量的值可以被改变。这种声明对应的是普通(非final)的Java变量。
var a:Int = 12a = 20var b:String = "hello"b = "world"println(a) // 20println(b) // world
- var 关键字允许变量改变自己的值,但它的类型却是改变不了的。
// 报错 Kotlin: Type mismatch: inferred type is String but Int was expectedvar answer = 42answer = "no answer"
- var 声明的变量在声明之后初始化,需要显式的指定类型,不然报错
// var 声明的变量在声明之后初始化,需要显式低指定类型,不然报错// 以下写法报错var aa = 12// 这样写才行var b: Intb = 12
- val (来自value) ,不可变引用。使用 val 声明的变量不能在初始化之后再次赋值。它对应的是 Java的 final变量。
// 报错,Kotlin: Val cannot be reassignedval a = 12a = 20
- 尽管val引用自身是不可变的,但是它指向的对象可能是可变的。
val languages = arrayListOf ("Java")languages.add("Kotlin")
2-4、const 和 val 的区别
特性 | **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">val</font>** ****(只读变量) | **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">const val</font>** ****(编译时常量) |
---|---|---|
初始化时机 | 运行时初始化 | 编译时初始化 |
存储位置 | 内存中分配存储空间 | 直接内联到字节码中 |
值类型 | 可以是任意表达式/函数返回值 | 必须是基本类型或字符串字面量 |
作用域 | 可声明在任何地方 | 只能声明在顶层或对象声明中 |
访问方式 | 通过引用访问 | 直接替换为字面值 |
注解使用 | ❌ 不能在注解中使用 | ✅ 可在注解中使用 |
- 示例
// 编译时常量
const val PI = 3.14
val a = System.currentTimeMillis()fun main(args: Array<String>) {// Kotlin: Modifier 'const' is not applicable to 'local variable'.// 报错 const编译时常量不能放在函数内部,函数内只在函数调用时才赋值
// const val PI = 3.14println(PI)println(a)
}