1思恐、包
Kotlin也沿襲了Java包的package的概念酝豪,可以在.kt文件開頭聲明package命名空間驱还,和Java不同的是.kt文件可以在目錄的任意位置嗜暴。
在同一個包命名空間下,可以直接調(diào)用议蟆,不需要import操作闷沥,如果不在同一個命名空間下,需要使用import來操作對應(yīng)的類和函數(shù)咐容。
另外狐赡,Kotlin會針對每個Kotlin文件默認導入一些基礎(chǔ)包
kotlin.*
kotlin.annotation.*
kotlin.collections.*
koton.comparisons.*
kotlin.io.*
kotlin.ranges.*
kotlin.sequences.*
kotlin.text.*
JVM平臺的包:
java.lang.*
kotlin.jvm.*
JS平臺
kotlin.js.*
2、變量和值
var 變量疟丙,可以多次賦值
val 常量颖侄,只能賦值一次
只需要根據(jù)變量類型填寫val和var,其類型能夠被推斷出來享郊,編譯器能夠檢測到其類型览祖,自動完成轉(zhuǎn)換,但是類型推斷不是所有的炊琉,例如整型Int不能賦值給Long變量展蒂。
fun main(args:Array<String>){
val str = "kotlin"
println(str)
println(str is String)
println(str::class)
println(str::class.java)
val bool = true
println(bool)
println(bool is Boolean)
println(bool::class)
println(bool::class.java)
val array = arrayOf("haha", "hehe", "heihei")
println(array)
println(array is Array)
println(array::class)
println(array::class.java)
}
其結(jié)果為:
kotlin
true
class kotlin.String
class java.lang.String
true
true
class kotlin.Boolean
boolean
[Ljava.lang.String;@ee7d9f1
true
class kotlin.Array
class [Ljava.lang.String;
3、使用is運算符進行類型檢測
var result = "hello kotlin"
if(result if String){
println(result)
}
4苔咪、字符串與其模板表達式
"""
這個格式中間的內(nèi)容
會按照原來的格式顯示锰悼,不會進行其他的排版
用來顯示特定格式的內(nèi)容
"""
5、流程控制語句
5.1 if-else
if的分支可以使代碼塊团赏,最后的表達式作為該快的值,其它的用法和Java一樣
fun max(a:Int,b:Int):Int{
val max = if(a>b){
println("Max is a")
a
}else{
println("Max is b")
b
}
return max
}
5.2 when表達式
when表達式類似switch-case箕般,但是寫法上更簡單,可以使用任意表達式作為分支條件
fun getName(a:Any){
when(a){
-1,0 -> println("x== -1 or x == 0")
1 -> println("x == 1")
2 -> println("x == 1")
else ->
println("x不是-1 ,0,1,2")
}
}
5.3 for循環(huán)
for循環(huán)可以對任何迭代器的對象進行遍歷
for(age in intArray){
println(age)
}
如果想要通過索引遍歷一個數(shù)組或者list
val ages = arrayOf(1, 2, 3)
for (i in ages.indices) {
print(ages[i])
}
for ((index, value) in ages.withIndex()) {
print("the index is $index and value is $value ")
}
5.4 while 循環(huán)
while(x>0){
x--
}
5.4 break和continue
break是跳出循環(huán)執(zhí)行循環(huán)體后面的語句舔清,continue是執(zhí)行下一次循環(huán)
5.5 標簽
在Kotlin中任何表達式都可以使用label標記丝里,標簽的格式為標識符后跟@符號曲初,例如:abc@、max@都是有效的標簽杯聚,我們可以使用label標簽來控制return臼婆、break或continue的跳轉(zhuǎn)行為。
fun returnLabel() {
val intArray = intArrayOf(1, 2, 3, 4, 5)
intArray.forEach testReturn@ {
if (it == 3) {
return@testReturn
}
println(it)
}
}
也可以使用隱式標簽幌绍,該標簽與接收該lambda的函數(shù)同名颁褂。
fun returnLabel2() {
val intArray = intArrayOf(1, 2, 3, 4, 5)
intArray.forEach {
if (it == 3) {
return@forEach
}
println(it)
}
}
有時候為了代碼可讀性,可以用標簽來顯示地指出循環(huán)體的跳轉(zhuǎn)地址傀广。
fun returnLabel3() {
for (outer in 1..5) {
inner@ for (inner in 1..10) {
if (inner % 2 == 0) {
break@inner
}
}
}
}
5.6 修飾符
下面列出了常用的修飾符
modifier
:classModifier
:accessModifier
:varianceAnnotation
:memberModifier
:parameterModifier
typeParameterModifier
:functionModifier
:propertyModifier
classModifier
:"abstract" 抽象類
:final" 不可被繼承final類
:"enum" 枚舉類
:"open" 可繼承open類
:"annotation" 注解類
:"sealed" 密封類
:"data" 數(shù)據(jù)類
memberModifier
:"override" 重寫函數(shù)
:"open" 可被重寫
:"final" 不可被重寫
:"abstract"
:"lateinit" 延遲初始化
accessModifier 訪問權(quán)限控制颁独,默認是public
:"private"
:"protected"
:"public"
:"internal" 成員的可見性是只在同一個模塊中才可見的
:"lateinit"
varianceAnnotation 泛型可變性
:"in"
:"out"
parameterModifier
:"noinline"
:"crossinline"
:"vararg"變成參數(shù)
typeParameterModifier
:"reified"
functionModifier
:"tailrec"
:"operator"
:"infix"
:"inline"
:"external"
:"suspendModifier"
propertyModifier
:"const"
suspendModifier
:"suspend"
internel訪問權(quán)限,指的是在整個模塊內(nèi)可訪問主儡,模塊module是指一起編譯的一組Kotlin源代碼文件奖唯。
5.7 常見的關(guān)鍵字
this關(guān)鍵字持有當前對象的引用惨缆,如果this沒有限定符糜值,它指的是最內(nèi)層的包含它的作用域, 如果我們想要引用其他作用域中的this,可以使用this@label標簽
intent.setClass(this@UploadImageActivity, ImageGridActivity::class.java)
super關(guān)鍵字持有指向其父類的引用
5.7 常用的操作符
引用相等 === 坯墨!== 兩個引用指向同一對象
結(jié)構(gòu)相等 == 寂汇!= 使用equals()函數(shù)判斷
a==b 如果a不是null則的調(diào)用 equals(Any?) 函數(shù)并返回值
否則 a === null 就計算 b