1.函數的定義與調用
fun add(a: Int, b: Int): Int {
return a + b
}
fun add2(a: Int, b: Int): Int = a + b
var i = { x: Int, y: Int -> x + y }
println(i(3, 5)) //8
var j: (Int, Int) -> Int = { x, y -> x + y }
println(j(3, 5)) //8
2.函數的遞歸
//累乘
fun fact(num: Int): Int {
return if (num == 1) {
1
} else {
num * fact(num - 1)
}
}
//累加
fun olladd(num: Int): Int {
return if (num == 1) {
1
} else {
num + olladd(num - 1)
}
}
//尾遞歸優化 累加
tailrec fun olladd2(num: Int, result: Int): Int {
println("第$num 次運算,result=$result")
return if (num == 0) {
result
} else {
olladd2(num - 1, result + num)
}
}
輸出:
第5次運算,result=0
第4次運算,result=5
第3次運算,result=9
第2次運算,result=12
第1次運算,result=14
第0次運算,result=15
15
3.面向對象
// a.封裝
// b.繼承 open關鍵字允許子類繼承和重寫方法
open class Fathor {
var xingge = "性格內向"
open fun action() {
println("行爲鬼怪")
}
}
//注意子類繼承和java的區別
class Son : Fathor() {
override fun action() {
println("行爲正常")
}
}
// c.多態 同種功能的不同形態
4.接口與抽象類
//Human爲抽象類 代表事物的本質
//IMan爲接口 代表事物的能力
class Man:Human(),IMan{
}
5.委託和代理(by)
interface IWashBowl{
fun wash()
}
class BigHeadSon : IWashBowl {
override fun wash() {
println("我是大頭兒子,我賺了1塊錢")
}
}
class SmallHeadFather : IWashBowl by BigHeadSon() {
override fun wash() {
println("我是小頭爸爸,我賺了10塊錢")
BigHeadSon().wash()
println("我看着兒子把碗洗好了")
}
}
fun main(args: Array<String>) {
val father = SmallHeadFather()
father.wash()
}
問題:在剛纔的代碼中,小頭爸爸的代理了一個大頭兒子by BigHeadSon()
之後又創建了一個BigHeadSon().wash()
大頭兒子,那麼我們需要把大頭兒子定義爲單例,只創建一次
6.單例
//把class改成object
object BigHeadSon : IWashBowl {
override fun wash() {
println("我是大頭兒子,我賺了1塊錢")
}
}
這個時候在小頭爸爸的類裏面只用創建一次大頭兒子,去掉()
即可
class SmallHeadFather : IWashBowl by BigHeadSon {
override fun wash() {
println("我是小頭爸爸,我賺了10塊錢")
BigHeadSon.wash()
println("我看着兒子把碗洗好了")
}
}
7.枚舉
enum class Week {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
8.印章類 Sealed
- 印章類更在意類型
- 枚舉更在意數據