純粹是個(gè)人學(xué)習(xí)總結(jié),如有不對(duì)的地方請(qǐng)吐槽。
kotlin包概念
其實(shí)kotlin類和包沒有直接的聯(lián)系,包名可以和文件存放的路徑不一致。
比如文件的存放地址是:com.xxx.yyy,包名可以是 package com.yyy.xxx
Imports關(guān)鍵字
在java中是用于導(dǎo)入的
在kotlin中也是導(dǎo)入作用的,它可以導(dǎo)入類,包,變量等等,導(dǎo)入方式和java也是一樣的
如果包有沖突可以用以下方式重命名
import foo.Bar // Bar 可以使用
import bar.Bar as bBar // bBar 代表 'bar.Bar'
在這里as關(guān)鍵字的作用就是將bar.Bar變成bBar來代表
定義一個(gè)kotlin類
//普通類定義
package com.yyy.xxx
class A{
fun a(){
println("這是一個(gè)無參無返回值的方法")
}
}
//有繼承關(guān)系的類
package com.yyy.xxx
class KotlinActivity : AppCompatActivity(){
//實(shí)現(xiàn)父類的方法
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
}
}
創(chuàng)建Kotlin類實(shí)例
val a = A()
跳轉(zhuǎn)到KotlinActivity:
startActivity(Intent(this, MainActivity::class.java))
kotlin嵌套類
函數(shù)定義
只有一個(gè)表達(dá)式的函數(shù)定義
fun sum(a: Int, b: Int):Int = a + b 也可以 fun sum(a: Int, b: Int) = a + b
//后面的定義就是編譯器可以推導(dǎo)出返回值類型,就可以不寫返回值類型
沒有返回值的函數(shù)定義
fun sum():Unit{ println("無參無返回值函數(shù)") }也可以fun sum(){ println("無參無返回值函數(shù)") }
默認(rèn)參數(shù)函數(shù)定義
fun sum(b: Int, off: Int = 0, stepNum: Int = 1) {
}
調(diào)用方式:sum(10)//沒有傳遞的參數(shù)就等于默認(rèn)值,這樣可以減少重載
命名參數(shù)函數(shù)定義
fun sum(str: String, isMax: Boolean = true,a: Char = ' ') {
}
調(diào)用方式:
1.默認(rèn)參數(shù)調(diào)用sum(str)
2.命名參數(shù)調(diào)用sum(str,isMax=true,a='a')或者sum(str,a='a')
這種方式調(diào)用,代碼可讀性更強(qiáng),更加靈活,沒有傳遞的參數(shù)就是默認(rèn)值
注意:命名參數(shù)語法不能夠被用于調(diào)用Java函數(shù)中,因?yàn)镴ava的字節(jié)碼不能確保方法參數(shù)命名的不變性
中綴符號(hào)
//給 Int 定義一個(gè)擴(kuò)展方法
infix fun Int.shl(x: Int): Int {
}
調(diào)用方式:1 shl 2 或者 1.shl(2)
注意:只能有一個(gè)參數(shù)
函數(shù)擴(kuò)展
在不繼承類的情況下增加方法叫Extensions(擴(kuò)展函數(shù)),我們需要在函數(shù)前加一個(gè)接收者類型作為前綴如給MutableList<Int> 添加一個(gè) swap 函數(shù):
fun MutableList<Int>.swap(x: Int, y: Int) {
val tmp = this[x] // this 對(duì)應(yīng) list
this[x] = this[y]
this[y] = tmp
}
調(diào)用方式:
val l = mutableListOf(1, 2, 3)
l.swap(0, 2)
在swap() 函數(shù)中this持有的值是l
變長參數(shù)函數(shù)定義
fun <T> asList(vararg ts: T): List<T> {
val result = ArrayList<T>()
for (t in ts)
result.add(t)
return result
}
調(diào)用方式:asList(1,2,3)或者asList(1,2,3,4,5),參數(shù)長度可隨意變換
只有一個(gè)參數(shù)可以被標(biāo)注為 vararg,如果vararg并不是列表中的最后一個(gè)參數(shù),那么后面的參數(shù)需要通過命名參數(shù)語法進(jìn)行傳值,再或者如果這個(gè)參數(shù)是函數(shù)類型,就需要通過lambda法則.
如果參數(shù)中有一個(gè)是數(shù)組怎么傳遞?
val a = array(1, 2, 3)
val list = asList(-1, 0, *a, 4)
a變量在傳遞時(shí)一定要加前面的*號(hào)
局部函數(shù)定義
在一個(gè)函數(shù)里面包含一個(gè)函數(shù)
fun dfs(graph: Graph) {
fun dfs(current: Vertex, visited: Set<Vertex>) {
if (!visited.add(current)) return
for (v in current.neighbors)
dfs(v, visited)
}
dfs(graph.vertices[0], HashSet())
}
更多函數(shù)說明:https://huanglizhuo.gitbooks.io/kotlin-in-chinese/content/FunctionsAndLambdas/Functions.html
接口定義
interface MyInterface {
fun bar()
fun foo() {
//函數(shù)體是可選的
}
}
接口實(shí)現(xiàn)
class Child : MyInterface {
fun bar () {
//函數(shù)體
}
}
和java一樣一個(gè)類可以實(shí)現(xiàn)一個(gè)或多個(gè)接口
基本語法
變量聲明
var聲明可變變量
var i = 1
i = 2
println("i:"+i)
輸出結(jié)果:i:2
val聲明只讀變量
val j = 1
val k:Int//只聲明沒有賦值
j=2//編譯會(huì)報(bào)錯(cuò)
k = 3//第一次賦值,編譯通過
val就相當(dāng)于java的final
if else
if else 和java的用法基本一致,kotlin沒有三目運(yùn)算符那怎么實(shí)現(xiàn)呢,就是用if else如:
var j = if(number>3) 0 else 1
when
when用法相當(dāng)于java中的switch,但是比switch強(qiáng)大
when的判斷條件可以重復(fù),如果重復(fù)了,就按照最先原則匹配。
while do ..while 循環(huán)
他們的用法和java中完全相同
字符串
賦值var str = "abc"
拼接:str+="def"http://拼接后abcdef
模板字符串
println("${str}123");//打印abcdef123
運(yùn)算:
var a=1
var b = 2
println("${str}123${a+b}");//打印abcdef1233
范圍表達(dá)式
創(chuàng)建范圍需要...操作符如:var i=1..10//i中包含1,2,3,4,5,6,7,8,9,10
創(chuàng)建降序范圍:var i = 3 downTo 1//i中包含3,2,1
步長范圍創(chuàng)建:var i = 1..10 step 5//i中包含1,6 降序也是一樣的
in操作符
判斷是否在某個(gè)范圍
if (x in 1..10)
print("x:${x}是在1-10之間")
判斷不在某個(gè)范圍
if (x !in 1..10)
print("x:${x}不在1-10之間")