《Kotlin入門實(shí)戰(zhàn)》CH2 | Kotlin 語法基礎(chǔ)

寫在前面

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

JVM語言生態(tài)

需要注意的式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.*
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容