1.Array. 等價(jià)java中的數(shù)組類型
2.kotlin類中聲明的成員變量(無論是var/val)都必須初始化,或者使用lateinit修飾,在后面使用前初始化,這和java不一樣,防止出現(xiàn)NullPointException;
但是在kotlin函數(shù)中的局部變量是可以不用初始化,編譯可以通過;
還有一種,可以通過自定義訪問器給屬性賦值
class Student(val name: String, var age: Int) {
// 自定義屬性訪問器
val isSquare: Boolean
get() {
return name == "lala"
}
}
3.創(chuàng)建kotlin的文件時(shí)會有一個(gè)選擇,file,class,這個(gè)兩個(gè)的區(qū)別是,如果這個(gè)文件有并排的兩個(gè)class,這個(gè)文件就是xxx.kt,如果只有這一個(gè)class,文件為xxx


創(chuàng)建kotlin文件時(shí)一般選擇類型為class,后續(xù)如果有并排的class會自動(dòng)轉(zhuǎn)換為file類型,增加.kt
后綴
4.if在kotlin中是表達(dá)式,有返回值,when是類似java中的switch,但是when也是表達(dá)式,有返回值,他們會把最后一個(gè)表達(dá)式會被作為結(jié)果返回;
when中沒有break,不會穿透執(zhí)行,如果需要多個(gè)值匹配,需要值之間用“,"分隔開,when允許使用任何對象作為作為分支條件,不像java必須是常量(枚舉常量,字符串或者數(shù)字);when還可以不用帶參數(shù);
fun testWhen(num: KotlinEnum) {
val value = when (num) {
KotlinEnum.RED,KotlinEnum.BLUE -> "k"
else -> "else"
}
println("when:is $value")
}
fun whenTest(num1: KotlinEnum,num2: KotlinEnum){
when {
num1 == KotlinEnum.BLUE && num2 == KotlinEnum.RED ||
num1 == KotlinEnum.RED && num2 == KotlinEnum.BLUE -> 1
else -> 2
}
}
5.Set集合,kotlin有一個(gè)set集合:http://www.itdecent.cn/p/3c95d7729d69
集合的遍歷:
fun testSet(){
// setOf返回的是不可變的有序的集合
val set = setOf<String>("2","3")
// for + in 是對set集合的遍歷
for (name in set) {
println(name)
}
}
6.is 相當(dāng)于java中的instanceOf,不同之處,java中需要顯示的類型轉(zhuǎn)換后才能使用,如果需要多次使用需要用局部變量保存,kotlin不需要
fun testIs(stu: Fu){
// is 相當(dāng)于java中的instanceOf,不同之處,java中需要顯示的類型轉(zhuǎn)換后才能使用,如果需要多次使用需要用局部變量保存,kotlin不需要
if (stu is Stu) {
// 能訪問的屬性必須是一個(gè)val屬性,不能有自定義的訪問器,否則不能保證每次返回同樣的值
println(stu.a)
}
// 特定類型的顯示轉(zhuǎn)換
val stu1 = stu as Stu
println(stu1.a)
}
7.for循環(huán)遍歷
fun testFor(){
val array = IntArray(4)
// array這個(gè)數(shù)組的下標(biāo)
for (i in array.indices){
}
// 包含右邊的結(jié)束值的區(qū)間
for (i in 100 downTo 1 step 2) {
}
// until 不包含100的區(qū)間
for (i in 1 until 100) {
}
val treeMap:TreeMap<Char,String> = TreeMap()
// map,通過map[key] 來讀取值 ,map[key] = value 賦值,不用通過put,get方法
treeMap['a'] = "aaaa"
treeMap['b'] = "bbbb"
// treemap的遍歷
for ((key,value) in treeMap) {
println("$key = $value")
}
val list = arrayListOf<Int>(3,5)
for ((index,element) in list.withIndex()) {
}
}
8.trow,try是一個(gè)表達(dá)式,if/when(switch)也是表達(dá)式
val percentage = 0
if (percentage !in 0..100) {
// throw是一個(gè)表達(dá)式
throw IllegalArgumentException("")
}
// try是一個(gè)表達(dá)式
// 如果一個(gè)try代碼塊執(zhí)行一切正常代碼塊中的最后一個(gè)表達(dá)式就是結(jié)果,如果捕獲了異常,相應(yīng)的catch代碼塊中最后一個(gè)表達(dá)式就是結(jié)果
val number = try {
Integer.parseInt("34")
} catch (e:NumberFormatException) {
return
}
println(number)
9.擴(kuò)展函數(shù),是靜態(tài)函數(shù),在java中可以通過文件名.方法名,直接調(diào)用,擴(kuò)展函數(shù)不能被重寫
擴(kuò)展函數(shù)是寫在類的外面

使用是,可以import這個(gè)函數(shù);
10.to函數(shù) 中綴調(diào)用,能以中綴調(diào)用的函數(shù)需要用infix修飾, 處理單個(gè)參數(shù)的函數(shù);
// to 中綴調(diào)用 to函數(shù)有infix修飾
val map = hashMapOf<Int,String>(1 to "one",7 to "seven")
11.kotlin中的String增加了一些擴(kuò)展方法,還可以繼續(xù)使用正則表達(dá)式,三重引號的字符串可以避免轉(zhuǎn)義字符,可以包含任何字符;
12.嵌套的類默認(rèn)不是內(nèi)部類:他們并沒有包含對其外部類的隱式引用;kotlin有一個(gè)可以聲明類并創(chuàng)建這個(gè)類的一個(gè)實(shí)例的object關(guān)鍵字(類似于java的匿名類);使用:代替java中的extends/implements關(guān)鍵字;同java一樣,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)類;
kotlin中,接口里可以有默認(rèn)方法(提供了方法體),但是java中沒有這樣的語法,java中如果繼承了kotlin的接口,必須實(shí)現(xiàn)所有的方法;
12.修飾符:
class DataModel {
var name: String? = null // ??
lateinit var name1: String
val age: Int = 2
// 先走init,再走constructor,這兩個(gè)
init {
println("init: ")
}
//
constructor() {
println(": constructor")
}
fun setup() {
// name1初始化,使用name1之前必須先調(diào)用這個(gè)方法進(jìn)行初始化,否則報(bào)異常
name1 = "lala"
}
}