做網(wǎng)站用到的單詞關(guān)鍵詞seo優(yōu)化公司
Kotlin簡介
2011年7月,JetBrains推出Kotlin項目,這是一個面向JVM的新語言
2012年2月,JetBrains以Apache 2許可證開源此項目。
2016年2月15日,Kotlin v1.0發(fā)布,這被認(rèn)為是第一個官方穩(wěn)定版本。
在Google I/O 2017中,Google宣布在Android上為Kotlin提供最佳支持,取代java成為官方開發(fā)語言。
函數(shù)和變量
kotlin中的函數(shù)和變量可以直接聲明在文件中
使用fun
關(guān)鍵字聲明函數(shù)
使用var
關(guān)鍵字聲明變量,可讀可寫變量
使用val
關(guān)鍵字聲明只讀變量,不可修改,相當(dāng)于java中的final
創(chuàng)建對象,只需調(diào)用構(gòu)造器即可,不需要java中的new關(guān)鍵字
fun main(){var age:Int =18
}fun doubleNumber(x:Int):Int{return x*2
}
聲明一個數(shù)組,使用arrayOf
關(guān)鍵字:
private val studyList = arrayOf("語文","數(shù)學(xué)","英語")
靜態(tài)函數(shù)
比如工具類中常用的dp2px()
- 直接寫在Util.kt文件中
private val displayMetrics = Resources.getSystem().displayMetrics
fun dp2px(dp:Float):Float{return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,displayMetrics)
}
那么在kotlin中調(diào)用的時候直接dp2px(15f)
即可。在java中調(diào)用使用Utilkt.dp2px(15f)
,需要在文件名后邊加上kt后綴
2. 使用object關(guān)鍵字聲明
object Util{private val displayMetrics = Resources.getSystem().displayMetricsfun dp2px(dp:Float):Float{return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,displayMetrics)}
}
在kotlin中調(diào)用Util.dp2px(15f)
,在java中調(diào)用Util.INSTANCE.dp2px(15f)
使用object關(guān)鍵字聲明,相當(dāng)于創(chuàng)建了一個類的單例對象
- 使用companion關(guān)鍵字 伴生對象
比如application:
class BaseApplication : Application(){companion object{private lateinit var currentApplication: Contextfun currentApplication():Context{retun currentApplication}}override fun onCreate(){super.onCreate()currentApplication = this}
}
在kotlin中調(diào)用BaseApplication.currentApplication()
,然后在java中調(diào)用BaseApplication.Companion.currentApplication()
類
依然使用class關(guān)鍵字聲明一個類:
class User{var name:String?=null//set,get方法要緊跟成員變量,且里邊要使用field關(guān)鍵字//set,get方法默認(rèn)可以不寫set(value){field = value}get(){field}constructor(){}constructor(name: String?){this.name = name}
}
繼承和實現(xiàn)接口只需要一個冒號:
,不同的是繼承的類需要加上一個括號()
。
class MainActivity:AppcompatActivity(),View.OnClickListener{...
}
但是需要注意的是,如果在類中顯式聲明了構(gòu)造器,就不能加上這個括號()
在調(diào)用父類的構(gòu)造器或者本類中其他構(gòu)造器都要使用:,比如
class MyView : View {constructor(context:Context):this(context,null){}constructor(context:Context, attr:AttributeSet?):super(context,attr){}
}
另外,對一個類成員的set,get方法的訪問,可以直接使用.成員變量名的方式:
user.name = "xxxxxx" //進(jìn)行賦值,相當(dāng)于調(diào)用了setName()方法
如果是在java中去調(diào)用,不能使用user.name,只能使用其set,get方法。但是如果使用某一個成員變量,需要在kotlin中聲明這個變量的時候,使用@JvmField
注解
@JvmField
var name:String?=null
匿名內(nèi)部類
創(chuàng)建一個一個匿名內(nèi)部類,需要object關(guān)鍵字
比如:
call.enqueue(object:Callback){override fun onResponse(call:Call, response:Response){}override fun onFailure(call:Call, e:IOException)
}
另外在內(nèi)部類中使用外部類的成員變量,在java中為Class.this.xx
,在kotlin中要使用this@Class.xx
靜態(tài)內(nèi)部類
- 靜態(tài)內(nèi)部類可以直接在一個類中使用class聲明一個內(nèi)部類,這個類可以使用伴生對象
- 如果要使用普通的嵌套內(nèi)部類,則需要
inner class
去修飾
另外internal
關(guān)鍵字可以去修飾類和方法,表示當(dāng)前module可見,別的module不可見
接口和抽象類,枚舉類
接口(interface xxx)和抽象類(abstract class xxx)的聲明,與java中相同
但是枚舉類不一樣:
class SdutyList{enum class Type{MATH{...}}
}
kotlin中的類默認(rèn)都是被final關(guān)鍵字修飾的,不能被繼承,方法不能被重寫,如果想要一個類可以被繼承,需要使用abstract
關(guān)鍵字修飾,方法需要使用open
修飾,才可以重寫。
判斷語句
if 和 when:
if(code in 100..199){} //表示code是否在100到199,雙閉區(qū)間
另外使用when關(guān)鍵字,相當(dāng)于java中的switch
when (code){//這里可以支持表達(dá)式in 100..199->{}in 200..299->{}else->{}
}
遍歷和循環(huán)
遍歷
除了常規(guī)的for遍歷一個數(shù)組或者集合
//比如有一個`users`的集合
var passUsers = ArrayList<User>()
for(user in users){if(user.age >= 18){passUsers.add(user)}
}
可以使用kotlin提供的操作符去簡化上述代碼:
//使用forEach操作符
users.forEach({user:User->if(user.age >= 18){passUsers.add(user)}
})
//如果forEach()中接收的參數(shù)只是一個lambda表達(dá)式,可以將{}提到括號外邊,且括號可以省略:
users.forEach{user:User->if(user.age>=18){passUsers.add(user)}
}
//另外,也可以使用類型推斷,不用聲明user的類型
users.forEach{user->if(user.age>=18){passUsers.add(user)}
}
//最后如果一個lambda表達(dá)式,只有一個參數(shù),那么這個參數(shù)可以省略不寫,而會有一個默認(rèn)的隱式參數(shù)it:User
users.forEach{if(it.age>=18){passUsers.add(it)}
}
還有,這個例子中相當(dāng)于過濾一些user,只要符合條件的user,那么可以使用filter
操作符來簡化:
//這里直接過濾出年齡大于等于18的用戶
passUsers.add(users.filter{ it.age >= 18 })
循環(huán)
- 使用repeat關(guān)鍵字
//注意這里是一個隱式參數(shù)`it:Int`
repeat(100){println(it)
}
- for-i循環(huán)
for(i in 0..99){println(i)
}
集合
- 使用庫函數(shù)
listOf<>()
或者mapOf<>()
- 使用對象
var studyList:List<Lesson> = ArrayList();
var map:Map<Int, String> = HashMap()
但是需要注意的是上面所創(chuàng)建的集合元素都是不可修改的,無法進(jìn)行增刪
所以如果需要元素可變,一般使用:
arrayListOf<>(),mutableListOf<>(),mutableMapOf<>(),hashMapOf<>()
var studyList:ArrayList<Lesson> = new ArrayList()
kotlin中的類系統(tǒng)
Java | Kotlin |
---|---|
Object | Any |
void | Unit |
kotlin中基本數(shù)據(jù)類型
Kotlin基本數(shù)據(jù)類型 | 位寬度 |
---|---|
Char | (字符型) |
Boolean | (布爾類型) |
Byte | 8(字節(jié)型) |
Short | 16(短整型) |
Int | 32(整型) |
Long | 64(長整型) |
Float | 32(浮點型) |
Double | 64(雙精度浮點型) |
變量的可空控制
kotlin中將變量分為可空和不可空兩種類型。
//這里的user是一個不可空類型,如果賦值為null,則會報錯
var user:User
//這里的user是一個可空類型,需要加一個問號?
var user:User?=null;
那么如果想要調(diào)用一個可空類型的變量,有兩種方式
user!!.getName() //表示強(qiáng)制調(diào)用,不管是否為null
user?.getName() //表示安全調(diào)用,如果不為null,才調(diào)用
雖然這里可以避免空指針,但是user為null肯定是有問題的,希望在編寫代碼的時候早發(fā)現(xiàn)這些問題。
一個錯誤的示例:
fun a(name:String){...
}
a(user?.getName()!!)