寫在前面
kotlin 為啥用fun聲明方法?
JetBrains : We use “fun” because we like it - and yes, we do know what the word means in English.

需要注意的式Kotlin是基于JVM的語言,而不是基于Java的語言,他們都可以翻譯成Class字節(jié)碼。
kotlin
1.變量和標(biāo)識(shí)符
- val 只讀,相當(dāng)于Java中的final修飾變量
- var可寫
val pi = 3.14
pi = 3 // error val 初始化之后不能修改內(nèi)容
另外Kotlin支持類型推斷
var pi : Int = 3.14 // 完整寫法
var pi = 3.14 // 根據(jù)初始化推斷出變量的類型
2. 關(guān)鍵字和修飾符
修飾符按照修飾的內(nèi)容可分為:類修飾符,成員修飾符,訪問權(quán)限修飾符,協(xié)變逆變修飾符,函數(shù)修飾符等
類修飾符
| 類修飾符 | 說明 |
|---|---|
| abstract | 抽象類 |
| final | 不可繼承的final類 |
| enum | 枚舉類 |
| open | 可繼承open類 |
| annotation | 注解類 |
| sealed | 密封類 |
| data | 數(shù)據(jù)類 |
成員修飾符
| 成員修飾符 | 說明 |
|---|---|
| override | 重寫函數(shù)/方法 |
| open | 聲明函數(shù)可以被重寫 |
| final | 聲明函數(shù)不可重寫 |
| abstract | 聲明函數(shù)為抽象函數(shù) |
| lateinit | 延遲初始化 |
訪問權(quán)限修飾符
| 訪問權(quán)限修飾符 | 說明 |
|---|---|
| private | 私有,當(dāng)前類訪問 |
| protected | 當(dāng)前類,派生類訪問 |
| public | 默認(rèn)值,對(duì)外可訪問 |
| internal | 模塊類可訪問 |
協(xié)變逆變修飾符
| 協(xié)變逆變修飾符 | 說明 |
|---|---|
| in | out T 相當(dāng)于 ? extends T |
| out | in T 相當(dāng)于 ? super T |
函數(shù)修飾符
| 函數(shù)修飾符 | 說明 |
|---|---|
| tailrec | 尾遞歸 |
| operator | 運(yùn)算符重載 |
| infix | 中綴函數(shù) |
| inline | 內(nèi)聯(lián)函數(shù) |
| external | 外部函數(shù) |
| suspend | 掛起協(xié)程函數(shù) |
屬性修飾符
| 屬性修飾符 | 說明 |
|---|---|
| const | 常量修飾符 |
| vararg | 變長(zhǎng)參數(shù) |
| noinline | |
| crossinline |
具體化類型修飾符
| 具體化類型修飾符 | 說明 |
|---|---|
| reified | 具體化類型參數(shù) |
特殊語義關(guān)鍵字
| 關(guān)鍵字 | 說明 |
|---|---|
| is | 類型判斷 |
| object | 單例類聲明 |
| when | 條件判斷,相當(dāng)于witch |
| by | 委托類或?qū)傩?/td> |
| init | 初始化代碼塊 |
| get/set | get/set函數(shù) |
*省去一些Java中出現(xiàn)的操作符
3. 流程控制語句
3.1 分支語句
-
if : if語句可以有返回值
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 } -
when :相當(dāng)于switch-case
fun casesWhen(obj : Any?){ when(obj){ 0,1,2,3,4,5,6,7,8,9 -> println("數(shù)字") "hello" -> println("字符串Hello") is char -> println("char 數(shù)據(jù)類型") else -> println("其他類型") // 相當(dāng)于default } } // 上面每個(gè)case都相當(dāng)于枚舉 // case 還可以使用 in/!in 判斷是否在區(qū)間 when(x){ in 1..10 -> println("x is in range 1 to 10") ! in 1..10 -> println("x is not in range 1 to 10") else -> println("kotlin 666") }// 計(jì)算n!階乘 fun fact(i: Int): Int { return when (i) { 0, 1 -> 1; else -> i * fact(i - 1) } }
3.2 循環(huán)結(jié)構(gòu)
for 循環(huán)
// for in 循環(huán)
for(i in arr){
println(i)
}
// 索引循環(huán)
for(i in array.indices){
println(array[i])
}
// index-value 循環(huán)
for((index,value) in array.withIndex()){
println("元素$value的下標(biāo)是$index")
}
// ranges 表達(dá)式循環(huán)
for(i in 1..10){
println(i)
}
{1..10}.forEach(print(it))
do-while/while循環(huán)
和java使用方法一樣
3.3 跳轉(zhuǎn)語句
return
return
= :
fun max(a : Int, b: Int) = if(a>b) a else b' = '作為函數(shù)返回值匿名函數(shù)
val sum = fun(a:Int , b : Int) = a+b-
Lambda表達(dá)式:
val sumf = fun(a: Int, b Int) = {a+b},調(diào)用lambda表達(dá)式返回的是一個(gè)函數(shù)`val sumf = fun(a:Int, b:Int) = {a+b} sumf(1,1) // 返回的是一個(gè)函數(shù)() - > Kotlin.Int sumf(1,1).invoke() // 調(diào)用這個(gè)函數(shù) sumf(1,1)() // 和invoke效果一樣
return在匿名函數(shù)和lambda表達(dá)式中作用不同
val intArray = intArrayOf(1,2,3,4,5)
intArray.forEach{
if(it == 3) return
println(it)
}
// 1,2
// 從lambda中return,lambda結(jié)束
intArray.forEach(fun(a:Int){
if(a == 3) return;
println(a)
})
// 1 2 4 5
// 從函數(shù)中return,函數(shù)執(zhí)行結(jié)束
標(biāo)簽
val intArray = intArrayOf(1,2,3,4,5)
// 顯式標(biāo)簽
intArray.forEach here@{
if(it == 3) return @here
println(it)
}
//隱式標(biāo)簽
intArray.forEach{
if(it == 3) return @forEach
println(it)
}
throw
val ex: Nothing = throw Exception("YYYYY") // 返回的類型式Nothing,不能作為函數(shù)的參數(shù)
4.運(yùn)算符重載
和C++ 中比較類似,需要區(qū)別的式C++中重載'+/-/*/等'就是 operator后面加對(duì)應(yīng)的符號(hào)就行了。但是kotlin中需要寫對(duì)應(yīng)的操作符
data class Point(val x: Int, val y : Int)
// 重載單目運(yùn)算符 '-',就是重寫操作符unaryMinus
operator fun Point.unaryMinus() = Point(-x,-y)
@RunWith(JUnit4::class)
class OperatorDemoTest{
@Test
fun test(){
val p = Point(1,1)
val np = -p
println(np) //輸出 Point(x=-1, y=-1)
}
}
運(yùn)算符和操作符的對(duì)應(yīng)關(guān)系
| 運(yùn)算符 | 操作符 |
|---|---|
| +T | T.unaryPlus() |
| -T | T.unaryMinus() |
| !T | T.not() |
| T++ | T.inc() |
| a-- | T.dec() |
| T + E | T.plus(E) |
| T - E | T.minus(E) |
| .... 略 |
=== 和 !== 不可重載
5. 包聲明
kotlin中目錄與包的結(jié)構(gòu)無需匹配,源代碼可以在文件系統(tǒng)的任意位。
kotlin會(huì)默認(rèn)導(dǎo)入一些基礎(chǔ)包到每個(gè)kotlin文件中
kotlin.* // Int、Long等數(shù)據(jù)類型
kotlin.annotation.* // 注解
kotlin.collections.* // 集合
kotlin.comparisons.*
kotlin.io.* // 輸入輸出
kotlin.ranges.* //
kotlin.sequences.*
kotlin.text.*
// JVM平臺(tái)默認(rèn)包
java.lang.*
kotlin.jvm.*
// js 平臺(tái)
kotlin.js.*