繼學習完kotlin的基礎知識後就是類與對象了。
-
類
Kotlin 中使用關鍵字 class 聲明類
class Human(var name:String){
fun eat(){
println("$name 在吃飯")
}
}
fun main(args:Array<String>){
var man= Human("小強")
man.eat()
}
2.封裝
- 隐藏内部實作的細節
- 隐藏内部實作的細節就是封裝
-
封裝就是隐藏内部實作的細節
封裝在fun函數前加個private 關鍵字就ok
3.繼承
在 Kotlin 中所有類都有一個共同的超類 Any,這對于沒有超類型聲明的類是預設超類
要聲明一個顯式的超類型,我們把類型放到類頭的冒号之後
父類必須是open的。如果父類允許子類重寫方法的話也需要在fun前面加open,子類重寫父類方法需要加override在fun前面
open class Base(p: Int){
open fun v(){}
fun nv(){}
}
class Derived(p: Int) : Base(p){
override fun v(){}
//override fun nv(){} 父類不允許子類重寫nv方法
}
4.抽象類和繼承
abstract class Human(var name:String){
abstract fun eat()
}
class Man(name:String):Human(name){
override fun eat(){
println("男人在吃飯")
}
}
class Woman(name:String):Human(name){
override fun eat(){
println("女人在吃飯")
}
}
5.接口
Kotlin 的接口與 Java 8 類似,既包含抽象方法的聲明,也包含實作。與抽象類不同的是,接口無法儲存狀态。它可以有屬性但必須聲明為抽象或提供通路器實作。
使用關鍵字 interface 來定義接口
interface MyInterface {
fun bar()
fun foo() {
// 可選的方法體
}
}
class Child : MyInterface {
override fun bar() {
// 方法體
}
}
需要了解
**接口是事物的能力
抽象類是事物的本質**
6.委托
委托模式已經證明是實作繼承的一個很好的替代方式, 而 Kotlin 可以零樣闆代碼地原生支援它。 類 Derived 可以繼承一個接口 Base,并将其所有共有的方法委托給一個指定的對象:
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
fun main(args: Array<String>) {
val b = BaseImpl(10)
Derived(b).print() // 輸出 10
}
Derived 的超類型清單中的 by-子句表示 b 将會在 Derived 中内部存儲。 并且編譯器将生成轉發給 b 的所有 Base 的方法。
請注意,覆寫會以你所期望的方式工作:編譯器會使用你的 override 實作取代委托對象中的實作。如果我們為 Derived 添加 override fun print() { print(“abc”) },該程式會輸出“abc”而不是“10”。
7.單例模式
把class聲名改成object就可以直接實作單例模式
8.枚舉
枚舉類的最基本的用法是實作類型安全的枚舉
enum class Week{
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
}
//Week.Monday
9.印章(密封)類
印章類就是指定個數個子類的類型,而不能有任何其他類型。
sealed class Child{
class Son:Child()
class Daughter:Child()
fun too(){
println("xxxxx")
}
}
fun main(args: Array<String>) {
var first:Child = Child.Son()
var second:Child = Child.Daughter()
}