現(xiàn)在google已經(jīng)將Kotlin列為第一語言,kotlin是一種可以與android兼容的語言,他不僅語法簡介碎罚,更具表達性,還具備類型安全和空值安全的特性纳像【A遥可以與java無縫互通。
今天我們就開始學(xué)習(xí)kotlin了,該系列內(nèi)容都是筆者學(xué)習(xí)時的筆記憔购,僅供學(xué)習(xí)使用宫峦。
一、變量聲明
說明:
1) 格式:val/var + 變量名稱 :類型 = 初始值 2)val 定義的是常量 只讀 final int value = 12; 3)var 可讀可寫 相當(dāng)于java中的String info = "String";
var info = "String"
val value = 12
二玫鸟、函數(shù)(可變參數(shù)函數(shù)导绷、匿名函數(shù),高階函數(shù))
說明:
1) 格式:fun 函數(shù)名(參數(shù)列表):返回值類型 { 函數(shù)體 } 2) 使用vararg 可變長參數(shù)來完成類似java中的可變參數(shù) 3) 匿名函數(shù):沒有函數(shù)名屎飘,直接通過輸入和輸出更直接的進行標(biāo)識 4)高階函數(shù):一個函數(shù)可以將另外一個函數(shù)作為參數(shù)妥曲,將其他函數(shù)用作參數(shù)的函數(shù)就是高階函數(shù)(類似于java中的額回調(diào)接口)
//普通函數(shù)
fun add(number: Double, number2: Double): Double {
return number + number2
}
//類型推導(dǎo)返回類型
fun add(number1: Int, number2: Int) = number1 + number2
//可變長參數(shù)
fun add(vararg value: Int) {
for (i in value) {
println(i)
}
}
//lambda 表達式 add代表對匿名函數(shù)的引用,(Int ,Int)是輸入?yún)?shù) ->Int 是輸出的返回值 {}是真正的函數(shù)體的實現(xiàn)
var add: (Int, Int) -> Int = { number1, number2 -> number1 + number2 }
//高階函數(shù)
fun highLevelFun(number: Int, add: (number1: Int) -> Int): Int {
return add(number)
}
三钦购、字符串模板
說明:
1檐盟、$ 變量名 2、自動換行用 """ """ 三組雙引號打印 使用trimIndent()去掉空格 使用triMargin()來去掉字符串中的某個字符
fun printDemo() {
println("字符串模板輸出:")
var name = "張三"
var age = 28
println("name=$name,age = $age")
var info = """
hello
world
""".trimIndent()
println(info)
}
四押桃、NULL空檢查機制
說明:
1葵萎、在聲明變量時使用? 代表通知所有在使用此變量時需要注意,這個變量可能為空,
補救措施:
1)在使用時加上? 代表為空時則不執(zhí)行
2)使用兩個!!唱凯,來表示此變量不為空羡忘,如果為空時會報出空指針異常
3)類似于java進行非空的判斷
4)使用 ?: 運算符來處理為null時的情況
fun emptyCheckDemo() {
println("null 空檢查機制")
var info: String? = null
var len = info?.length ?: 0
println(info?.length)
}
五、區(qū)間
1磕昼、in 在for循環(huán)中執(zhí)行區(qū)間操作 ..代表區(qū)間范圍(從小到大)卷雕;downTo 從小到大
2、使用step 來進行跳躍式訪問
3票从、until 排除最后元素的訪問
fun inAreaDemo() {
println("區(qū)間輸出:")
for (i in 1..10) {
println(i)
}
println("-----------")
for (i in 10 downTo 1) {
println(i)
}
println("-----------")
for (i in 1 until 10) {
println(i)
}
}
六爽蝴、比較
1、== 來比較兩個對象的值
2纫骑、=== 來比較兩個對象的地址
fun compareDemo() {
var number: Int = 1000
var number1: Int = 1000
println(number == number1)
println(number === number1)
}
七、條件判斷
1九孩、 if else 與java中的基本相同先馆,只是每一個條件的最后一句執(zhí)行結(jié)果是作為if else 的滿足條件返回值
2、 when 相當(dāng)于java中的switch , 但是when 是可以有返回值的躺彬,且when的條件可以是任意的類型或表達式,且可以是區(qū)間;
如果要接受when的返回值煤墙,則必須在when的條件最后加else 來完成返回值 如果返回值數(shù)據(jù)類型不相同,可以使用Any?來修飾接受結(jié)果的變量宪拥,相當(dāng)于java中的Object
fun judgeDemo() {
println("條件判斷")
var number = 100
var ifResult = if (number == 100)
"true"
else
"false"
println(ifResult)
var result: Any? = when (number) {
0 -> "0"
100 -> "100"
in 100..200 -> "200"
else -> 'M'
}
println(number)
}
八仿野、循環(huán)和標(biāo)簽
1、標(biāo)簽:標(biāo)簽名@ 做一個標(biāo)記她君,相當(dāng)于goto
2脚作、for in foreach 來完成循環(huán)
fun cycleAndTagDemo() {
tag@ for (j in 1..20) {
for (i in 1..100) {
if (i == 50) {
break@tag//結(jié)束外層循環(huán)
}
}
}
}
九、類
1、類與java的類相同球涛,只是類的屬性默認是public 劣针,可以通過對象直接訪問,需要顯式聲明為private
2亿扁、在類的對象初始化時必須對屬性進行初始化捺典,這樣你可以在得到示例時立即訪問他的屬性
3、也可以使用lateinit來推遲屬性的初始化
4从祝、伴生對象:用于定義在概念上與某個類型相關(guān)襟己,但不與其特點對象關(guān)聯(lián)的變量或函數(shù)。
說白了: 類似于java中的static修飾的變量和方法
5牍陌、主次構(gòu)造:次構(gòu)造必須調(diào)用主構(gòu)造
6擎浴、kotlin中的類默認是public final 修飾的,不能被繼承呐赡,需要加上 open 修飾后才可以繼承
7退客、kotlin 所有的對象都是沒有默認值的,可以使用lateinit 來進行懶加載初始化链嘀,lateinit只能修飾var的變量
8萌狂、內(nèi)部類必須加上inner ,否則只是嵌套類
open class Car(id: Int)//主構(gòu)造
{
var name: String = ""
var age: Int = 0
//在初始化塊中進行初始化屬性
init {
name = "leon"
age = 18
}
// 伴生對象
companion object {
val TAG: String = "Person"
}
//次構(gòu)造, 也可以重載
constructor(id: Int, name: String) : this(id) {
this.name = name
}
//內(nèi)部類怀泊,可以訪問外部類成員
inner class Wheel {
fun show() {
println(name)
}
}
//外部類茫藏,不以訪問外部類成員
class Light {
fun show() {
// println(name)
}
}
}
class pCar(id: Int) : Car(id) {
}
十、抽象類與接口霹琼、data,object
1务傲、所有的接口默認都是open
2、在類實現(xiàn)接口的時候枣申,接口后面不需要加()括號售葡,多個接口實現(xiàn)時需要用逗號隔開
3、在類與接口的實現(xiàn)類中忠藤,將類的繼承放在前面
4挟伙、data 修飾的class 其實類似于java中的實體bean,會自動生成很多java的方法
5模孩、object 修飾的尖阔,相當(dāng)于單例,只實例化一次
//接口
interface ICallBack {
fun notify(message: String);
}
//抽象類
abstract class Person : ICallBack {
abstract fun updateName(name: String)
abstract fun updateAge(age: Int)
}
//實現(xiàn)類
class Student : Person() {
override fun updateName(name: String) {
TODO("Not yet implemented")
}
override fun updateAge(age: Int) {
TODO("Not yet implemented")
}
override fun notify(message: String) {
TODO("Not yet implemented")
}
}
//數(shù)據(jù)bean
data class HttpResultBean(val code: String, val msg: String, val result: Any)
class NetManager {
//單例
object Holder {
val instance = NetManager()
}
//伴生對象榨咐,靜態(tài)區(qū)
companion object {
fun getInstance(): NetManager = Holder.instance
}
fun show(mes: String) {
println(mes)
}
}