1. Kotlin基礎(chǔ)語法

寫在前面 雖然在沒有系統(tǒng)學(xué)過Java的情況下來直接學(xué)Kotlin可能不是特別好,但畢竟之前學(xué)過C/C++/C#,對(duì)Python等等也多少都用過一點(diǎn)點(diǎn)。
來源 同樣按照我自己的習(xí)慣在runoob上看的,講的不夠深但是自己思考的空間比較多。盡管都有,但是還是手打一遍可以加深印象。
注意 這里有很多東西都是我自己理解的,所以批判的眼光是很有必要的!

包聲明

package com.fcox.ipp

import java.util.*

fun test(){}
class aaa {}

這個(gè)package應(yīng)該是聲明這個(gè)程序?qū)儆谀膫€(gè)包。

如此這個(gè)函數(shù)test()和類aaa的全名應(yīng)該是com.fcox.ipp.test()com.fcox.ipp.aaa

也可以不指定包,將默認(rèn)為default包。

import就是導(dǎo)入包吧。

默認(rèn)導(dǎo)入

有多個(gè)包會(huì)被默認(rèn)導(dǎo)入

  • kotlin.*
  • kotlin.annotation.*
  • kotlin.collections.*
  • kotlin.comparisons.*
  • kotlin.io.*
  • kotlin.ranges.*
  • kotlin.sequences.*
  • kotlin.text.*

函數(shù)定義

與C/C++等等都不一樣,函數(shù)聲明要關(guān)鍵字的fun

fun sum(a: Int, b: Int):Int{
  return a+b
}

參數(shù)寫法也不大一樣,參數(shù)名: 類型的形式,返回值寫在后面的冒號(hào)后面。簡單的函數(shù)可以自動(dòng)判斷返回值,即

fun sum(a: Int, b: Int) = a + b
public fun sum(a: Int, b: Int): Int = a + b

這寫法有點(diǎn)厲害,注意public方法不能省略返回值類型。以及這也是一個(gè)可以不寫分號(hào)的語言。

對(duì)于無返回值函數(shù),用Unit表示,同時(shí)這個(gè)Unit可以省略,public方法同樣可以省略。

fun bala(a: Int): Uint{
  //do sth
}
public fun bala(a: Int){
  //do sth
}

可變長參數(shù)函數(shù)

vararg來標(biāo)識(shí)可變長參數(shù)

fun main(args:Array<String>){
    print(sum(1,2,3)) //返回6
}
fun sum(vararg v: Int): Int{
    var s: Int = 0
    for(vt in v) s += vt
    return s;
}

匿名函數(shù)(lambda)

fun main(args: Array<String>){
  val subLambda: (Int,Int) -> String = {x,y -> (x+y).toString()}
  print(subLambda(1,2))
}

lambda大概是(參數(shù)類型, 參數(shù)類型) -> 返回值類型 = {參數(shù), 參數(shù) -> 參數(shù)與參數(shù)的運(yùn)算}

定義常量與變量

var <標(biāo)識(shí)符> : <類型> = <初始化值> //可變變量
val <標(biāo)識(shí)符> : <類型> = <初始化值> //只能賦值一次

引用前記得初始化就行。編譯器可以自動(dòng)判斷類型,所以有的時(shí)候可以不用寫類型。

注釋

跟C/C++一樣,不過允許嵌套

其實(shí)就是/*sjk/*ss*/ajs*/都被注釋掉了。

字符串模板

$varname便是變量值
${fun()}表示方法返回值

var b : String = "a is $a"
var result = "result is ${subLambda(1,2)}"

NULL檢查機(jī)制

有兩種處理方式,一種是后面加!!拋出異常,另一種是后面加?不處理返回空值或者配合?:做處理

var age: String? = "aa"
age = null;
//val age1:Char? = age!!.get(100)
val age2:Char? = age?.get(100)
val age3:Char? = age?.get(100) ?: 'H'
print(age)

這塊東西有點(diǎn)點(diǎn)復(fù)雜,簡單說一小下。
?/!!這兩個(gè)東西可以用在變量聲明上,也可以用在調(diào)用上,注意345行=后面就是安全調(diào)用,而且如果調(diào)用的變量是!!的,即非空的,那么它的調(diào)用不用?,也就是不用安全調(diào)用。只有在變量為可空情況下,調(diào)用的時(shí)候使用!!?才是有意義的,第5行的?:就是三目運(yùn)算符,沒啥可說的。

其實(shí)我的理解就是,對(duì)于可能為空的東西,在你想要賦給一個(gè)不可為空的東西時(shí),就需要你一定對(duì)他進(jìn)行檢查,以此來保證不產(chǎn)生空指針的情況。這個(gè)編譯器的檢查還是挺厲害的。

類型檢測(cè)及自動(dòng)類型轉(zhuǎn)換

可以使用is來檢查一個(gè)表達(dá)式是否是某個(gè)類型的一個(gè)實(shí)例。

fun TypeCheck(obj: Any): Int?{
    if(obj is String) return obj.length
    else if(obj is Int) return obj
    return null
}
  • 在做過類型檢測(cè)后,obj會(huì)被轉(zhuǎn)換為對(duì)應(yīng)的類型,如第2行的String和第3行的Int
  • 如果obj既不是String也不是Int,那么會(huì)走第4行的return null,此時(shí)的obj仍舊是Any類型的
  • Any類型也就是接受任意類型,免了函數(shù)重載,厲害了
  • 注意上面的方法定義的返回值是Int?的,否則是不允許返回null
  • is是個(gè)運(yùn)算符,有!is的用法

區(qū)間

這個(gè)挺方便,主要涉及的東西..,in,!instep,downTountil

for(i in 1..4) print(i) //1234 就是1到4
for(i in 4..1) print(i) //啥也不輸出
for(i in 4 downTo 1) print(i) //4321 也就是反向嘍
for(i in 1..10 step 3) print(i) //14710 設(shè)置了步長,反向也一樣,不羅嗦了
for(i in 1 until 5) print(i) //1234 排除了結(jié)尾元素
最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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