寫在前面 雖然在沒有系統(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,!in,step,downTo,until
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é)尾元素