Kotlin 進(jìn)階之路 目錄
1.接口
/**
* 接口 interface : 方法呛伴、屬性或一段功能的"藍(lán)本"
* 僅僅是規(guī)定實(shí)現(xiàn)的標(biāo)準(zhǔn)(抽象的)
*
* 通常用于對類進(jìn)行附加功能寥掐,可以用類保持簡潔的定義
* 通過實(shí)現(xiàn)1個(gè)或N個(gè)接口的組合,來實(shí)現(xiàn)非繼承式的功能增強(qiáng)
*/
//接口定義: interface 接口名 {//各種屬性或方法定義 }
interface Livable {
val hasSkill: Boolean
}
interface ChinaLivable {
//接口中的屬性只有類型定義,不可初始化
val hasJobOffer: Boolean
//接口中的屬性可以有g(shù)et,通常用于單純地增加一個(gè)常量屬性
val visaCategory: String
get() = "工作簽證"
//接口中的變量屬性
var city: String
//接口中的方法
fun speakChinese()
//接口中的方法可以有默認(rèn)實(shí)現(xiàn),通常指該方法是固定不變的
fun handleGuanxi() {
println("在中國要學(xué)會(huì)處理人際關(guān)系")
}
}
open class Person {
var name =""
}
//繼承父類磷蜀,并實(shí)現(xiàn)多個(gè)接口
class ForigenChinese : Person(),Livable,ChinaLivable{
override val hasJobOffer: Boolean
get() = true
override var city =""
override fun speakChinese() {
println("我叫${this.city},漢語水平一級")
}
override val hasSkill: Boolean
get() = true
}
fun main(args: Array<String>) {
val tom = ForigenChinese()
tom.name = "Green"
tom.city = "Beijing"
tom.speakChinese()
tom.handleGuanxi()
println(tom.visaCategory)
println("tom有技能:${tom.hasSkill}")
}
我叫Beijing,漢語水平一級
在中國要學(xué)會(huì)處理人際關(guān)系
工作簽證
tom有技能:true
2.泛型
/**
* 泛型 Generics
* 讓一個(gè)類型被廣泛使用,即,通用化,稱之為"泛型"
* 一般用于函數(shù)的參數(shù)類型定義
*/
fun main(args: Array<String>) {
//最常用的例子:print和println函數(shù)召耘,幾乎可以放任何參數(shù)類型
println(2)
println("泛型")
//Array,參數(shù)也可以是任意類型
val a = arrayOf(1, 2, 3)
//自定義一個(gè)泛型函數(shù):<T> Type的首字母縮寫,T 代表一個(gè)占位符,用尖括號包含
fun <T> showText(para: T) {
println(para)
}
showText("自定義泛型")
showText(2)
//有時(shí)候系統(tǒng)提供的泛型函數(shù)很好
//求和
val sum = arrayOf(1, 2, 3, 4, 5).sum()
println(sum)
//整數(shù)褐隆、小數(shù)在一起sum()無法求和
//val sum = arrayOf(1,2,3,4,5.5).sum()
//println(sum)
//泛型約束:<泛型占位符:類型>
fun <T : Number> sum(vararg numbers: T): Double {
return numbers.sumByDouble { it.toDouble() }
}
println(sum(1, 2, 3, -0.5, 5))
//多重約束 :where,哥哥約束用逗號分割,寫在函數(shù)體之前
//例子:把數(shù)組中大于某個(gè)(閾值)的部分取出并升序排列
//(1,2,-398,88,1024,8888)
fun <T> biggerPart(list: Array<T>, threhold: T): List<T>
where T : Number, T : Comparable<T> {
return list.filter { it >= threhold }.sorted()
}
val b = arrayOf(1, 0, 123, -12, 11, 666)
println(biggerPart(b,11))
}
2
泛型
自定義泛型
2
15
10.5
[11, 123, 666]
3.擴(kuò)展
/**
* 擴(kuò)展:對既有類增加新功能而無需繼承該類污它,及時(shí)獲取源代碼
* 主要作用是"立即"為相關(guān)類 整體上添加工具類(Utils)方法或?qū)傩?高效優(yōu)雅。
* Kotlin:擴(kuò)贊函數(shù),擴(kuò)展屬性
*
* 與接受者中參數(shù)庶弃、名稱都一樣的擴(kuò)展是無效的衫贬。
* 盡量避免與已有的名字重名,如果一定要重名歇攻,參數(shù)名和類型也要不一樣固惯。
*/
//擴(kuò)展函數(shù): fun 函數(shù)接受者類型,新擴(kuò)贊函數(shù)名(參數(shù)類別) {//函數(shù)實(shí)現(xiàn)}
//1.普通函數(shù)擴(kuò)展:整數(shù)的平方
fun Int.square(): Int {
return this * this
}
//2.泛型擴(kuò)展函數(shù):取數(shù)字型數(shù)組中最大的元素
fun <T> Array<T>.biggest(): T
where T : Number, T : Comparable<T> {
var biggest = this[0]
for (i in 1..lastIndex) {
val element = this[i]
if (element > biggest) {
biggest = element;
}
}
return biggest
}
fun <T> Array<T>.smallest(): T where T : Number, T : Comparable<T> {
var smalllest = this[0]
for (i in 1..lastIndex) {
val element = this[i]
if (element < smalllest) {
smalllest = element
}
}
return smalllest
}
//泛型屬性擴(kuò)展
//1.普通屬性擴(kuò)展 缴守。例子:整數(shù)的下一個(gè)數(shù)字
val Int.next: Int
get() = this + 1
//2.泛型屬性擴(kuò)展:數(shù)字類型的半徑對應(yīng)的類型
val <T : Number> T.area: Double
get() = 3.1415926 * this.toDouble() * this.toDouble()
fun main(args: Array<String>) {
println(5.square())
println(2.area)
val a = arrayOf(1, 2, 3, -88)
// println(a.max())
// println(a.min())
println(a.biggest())
println(a.smallest())
println(3.next)
}
25
12.5663704
3
-88
4