本文同步更新于旺仔的个人博客,访问可能有点慢,多刷新几次。
Kotlin中有一些常用的关键字和标识符,同时还有一些操作符和特殊符号,这些都是和Java有不一样的地方的,这里将他们介绍一下,方便记忆和回看。
硬关键字(Hard Keywords)
Kotlin中的硬关键字不能作为标识符
package
与Java一样,Kotlin的源文件同样以包声明开始的。
package foo.bar
fun baz() {}
class Goo {}
// ...
interface
interface
表示声明一个接口,
interface MyInterface {
fun bar()
fun foo() {
// 可选的方法体
}
}
class
Kotlin的类的声明与Java一样,使用class
关键字
class Invoice {
}
object
object
为同时声明一个类及其实例,请看对象表达式。
super
具体内容可看Kotlin学习_类和继承、接口与实现。
引用一个方法或属性的超类实现
open class Foo {
open fun f() { println("Foo.f()") }
open val x: Int get() = 1
}
class Bar : Foo() {
override fun f() {
super.f()
println("Bar.f()")
}
override val x: Int get() = super.x + 1
}
在此构造函数中调用超类构造函数
class MyView : View {
constructor(ctx: Context) : super(ctx)
constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
}
null
null
是表示不指向任何对象的对象引用的常量。
this
在次构造函数(二级构造函数)中调用同一个类中的另一个构造函数。
class Person(val name: String) {
constructor(name: String, paret: Person) : this(name) {
parent.children.add(this)
}
constructor(name: String, parent: Person, count: Int) : this(name) {
parent.children.add(this)
}
}
typealias
类型别名为现有类型提供替代名称。如果类型名称太长,您可以引入不同的较短的名称,并使用新的名称。
缩短长泛型类型:
typealias NodeSet = Set<Network.Node>
typealias FileTable<K> = MutableMap<K, MutableList<File>>
可以为功能类型提供不同的别名:
typealias MyHandler = (Int, String, Any) -> Unit
typealias Predicate<T> = (T) -> Boolean
as
as
是一个中缀操作符。
用于类型转换
as
是不安全的转换操作符,如果as
转换失败,会抛出一个异常,这就是不安全的。
val x: String = y as String
上面的代码表示将y
强转为String
类型,如果y
为null,那么将不能转换成String
,因为String
是不可空的类型,那么就会抛出一个异常,所以如果y
的类型是可空类型的话,那么强转的类型就必须是可空的
val x: String? = y as String?
用于指定导入包的别名
as
除了用于类型转换之外,还有一个作用就是可以指定导入包的别名
import foo.Bar // Bar 可访问
import bar.Bar as bBar // bBar 代表“bar.Bar”
as?
as?
与as
类似,也是转换操作符,但是与as
不同的是,as?
是安全的,也就是可空的,可以避免抛出异常,在转换失败是会返回null
val x: String? = y as? String
as
后面的类型是个可空的类型,而as?
后面的类型确实非空类型,但是as?
转换的类型却是可空的,这样是主要的区别。
if
和else
在Kotlin中,if
表达式表示返回一个值(true
或false
),Kotlin中没有三目运算符。
而else
与Java定义一样,定义一个if
表达式条件为false
时执行的分支。
//传统用法
var max = a
if (a < b)
max = b
//带 else
var max: Int
if (a > b)
max = a
else
max = b
//作为表达式
val max = if (a > b) a else b
true
和false
指定布尔类型的”真”值和”假”值。
while
和do
while
是开始一个while
循环(前置条件的循环),而do
为开始一个do/while
循环(后置条件的循环),do...while
与Java的一样,有一个区别是,语句块里面的变量在外面是可见的
while (x > 0) {
x--
}
do {
val y = retrieveData()
} while (y != null) // y 在这是可见的
for
for
表示开始一个for
循环
for (item: Int in ints) {
// ...
}
when
Kotlin中的when
就类似与Java的switch
,但是与switch
不同的是,when
在其它分支都不匹配的时候默认匹配 else
分支,如果没有把所有可能和分支条件列出来,那么else
是强制的,这与switch
的default
也有区别。
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 默认
print("x is neither 1 nor 2")
}
}
break
break
用于终止循环的执行,使用break
跳转到标签处,跳出循环
loop@ for (i in 1..10) {
for (j in i..10) {
if (j == 5)
break@loop // 跳出循环
Log.e(Tag, j.toString()) // j 为5的时候跳出了循环,只打印1、2、3、4
}
}
continue
continue
用于跳到最近的闭合循环的下一次循环
loop@ for (i