声明变量
在 Kotlin 中定义一个变量,通过关键字 var 开始。然后是变量名,在“:”后紧跟变量类型。
示例1:声明一个 int 类型的变量
var num:Int = 1
示例2:声明一个 String 类型的变量
var str:String = "Hello world"
内置数据类型
Kotlin 语法里内置的数据类型有很多种,如下所示:
只读变量
使用关键字 val 来修饰,就相当于 java 中 final 修饰的量,即常量。在初始化时赋值后就不能修改了。
val name:String = "HL"
如果要声明可修改的变量,使用 var 关键字;如果要声明只读变量,使用 val 关键字。
类型推断
对于已声明并赋值的变量,它允许省略类型定义。如果变量在声明时就赋了值,那么编译器就能根据这个值来推断出变量的类型,就没必要再去指明它的类型了。
示例1:
var num = 1
示例2:
var name = "HL"
编译时常量
上面提到的只读变量,它并非绝对只读。编译时常量只能在函数之外定义,用关键字 const 修饰。因为编译时常量必须在编译时赋值,而函数都是在允许时才调研,函数内的变量也是在运行时赋值,编译时常量要在这些变量赋值前就已存在。
const val MAX = 200
fun main(){
val a = 5
println(a)
}
编译时常量只能是常见的基本数据类型:String,Int,Double,FLoat,Long,Short,Byte,Char,Boolean。
查看 Kotlin 字节码
查看 Kotlin 编译之后的字节码,有助于我们深入理解 Kotlin 语言。两种方式:1) Shift 键两次,输入 show kotlin Bytecode;2)Tools-->Kotlin-->Show?kotlin Bytecode。
Kotlin?的引用类型与基本数据类型??
Java 有两种数据类型:引用类型与基本数据类型。Kotlin 只提供引用类型这一种数据类型,出于更高性能的需要,Kotlin 编译器会在 Java 字节码中改用基本数据类型。
条件语句
a)表达式
?if/else if 表达式。这与 java 是一样的;
?range 表达式。in A..B,in 关键字用来检查某个值是否在指定范围之内。
示例
fun main() {
val age = 5
if (age in 0..3){
println("婴幼儿")
}else if (age in 3..12){
println("少儿")
}else{
println("未知")
}
}
打印结果
当然,in 后面还可以接 List、Set 和数组等。
?when 表达式。在 kotlin 里面,switch/case 改成了 when?表达式,更简洁。允许你编写条件式,在某个条件满足时,执行对应的代码。注意:"->" 为?lambda 表达式。
val school = "小学"
val level:Any = when(school){
"幼儿园" -> "幼儿"
"小学" -> "少年"
"中学" -> "青少年"
else -> {
println("未知")
}
}
println(level)
level 变量接收 when 表达式的返回结果。打印如下
注意:在 Kotlin 中,只要代码包含 else if 分支,都建议改用 when 表达式。
*String 模板
模板支持在字符串的引号内放入变量值,通过 $ 符合加入。而在 java 中则是通过 + 号来完成。还支持字符串里计算表达式的值并插入结果,添加在 ${}中的任何表达式,都会作为字符串的一部分求值。
示例1:把变量的的值拼接到字符串里
val name = "HL"
val age = 17
println("My name is $name,and I am $age years old.")
示例2:计算表达式的值(${})并插入字符串里
val flag = true
println("The answer is: ${if(flag) "我也喜欢你!" else "对不起,你是个好人!"}")
函数
函数头
包括:可见性修饰符(与 java 相同);函数声明关键字 fun;函数名;函数参数;返回类型。
示例1:返回 String 类型
private fun test(age : Int, name : String) : String{
return "His name is $name, and he is $age years old."
}
示例2:无返回类型
// 无返回类型
private fun user(age : Int, name: String) {
println("His name is $name, and he is $age years old.")
}
?注意:函数的返回类型放到最后了,这样更合理。传入参数在前,返回结果在后。即先有输入再有输出。
函数参数
?默认值参:如果不打算传入值参,可以预先给参数指定默认值
示例:
fun main() {
user("HL")
}
// 无返回类型
fun user(name : String, age : Int = 5) {
println("His name is $name, and he is $age years old.")
}
注意:1)有默认值的参数必须放在最后,否则会报错。2)如果参数有默认值,如果在调用函数时仍然传入了新值,那么参数为传入的值。
?具名函数参数:如果使用命名值参,就可以不用管值参的顺序。这一般在函数参数特别多的情况下可以这么做。
示例:
fun main() {
user(name = "HL", sex = "男", age = 12)
}
// 无返回类型
fun user(age : Int, name : String, sex : String) {
println("His name is $name, and he is $age years old.")
}
在调用 user 函数传参时,指定 age, name, sex 参数名时,就可以不考虑它们在函数中的先后顺序。
Unit 函数
不是所有函数都有放回值,Kotlin 中没有返回值的函数叫 Unit 函数,也就是说他们的返回类型是 Unit。在 Kotlin 之前,函数不返回任何东西用 void 描述,意思是“没有返回类型,不会带来什么,忽略它”,也就是说如果函数不返回任何东西,就忽略类型。但是,void 这种解决方案无法解释现代语言的一个重要特征,泛型。
示例:
fun main() {
println(user("HL"))
}
// 无返回类型
fun user(name : String, age : Int = 5) {
println("His name is $name, and he is $age years old.")
}
Nothing 类型
TODO 函数的任务就是抛出异常,就是永远别指望它运行成功,返回 Nothing 类型。
public inline fun TODO(reason: String): Nothing = throw NotImplementedError("An operation is not implemented: $reason")
fun main() {
println(user("HL"))
TODO("nothing")
println("after TODO")
}
// 无返回类型
fun user(name : String, age : Int = 5) {
println("His name is $name, and he is $age years old.")
}
上述代码运行到 TODO() 函数时就直接抛了一个异常,结果如下。?
nothing 类型的实际作于:如果说想要像 TODO() 一样终止代码运行,又不返回什么东西,就可以返回一个 nothing 类型。
*反引号中的函数名
?Kotlin 可以使用空格和特殊字符对函数命名,不过函数名要用一对反引号括起来。注意:是反引号不是单引号。
作用:比如有时需要测试时,函数名就可以叫做“test 某某函数” ,就可以加空格,就可以很清晰。
fun main() {
`~~#@r0o_a123_special_&&&&&&2334`()
}
fun `~~#@r0o_a123_special_&&&&&&2334`(){
println("special fun name")
}
?为了支持 Kotlin 和 Java 互操作,而 Kotlin 和 Java 各自有着不同的保留关键字,不能作为函数名,使用反引号括住函数名就能避免任何冲突。
示例: Kotlin 的 is 关键字。
public class JavaClass {
public static void is(){
System.out.println("Is is the key word for kotlin.");
}
}
上面是一段 java 代码,要做 kotlin 中调用此函数的 is() 方法,那么久需要用到反引号,否则会报错。如下
fun main() {
JavaClass.`is`()
}
如果没有反引号,如下:is() 函数报错