學習kotlin系列之六(面向對象)

1、訪問器

kotlin字段是私有的 會生成get和set方法
當有需求只能內部設置名稱 外部不能修改名稱
方法就是:在該屬性下增加private set

1)訪問器

fun main(args: Array<String>) {
    val person = Person()
    println(person.age)
    println(person.name)
//    person.name="hehe" //無法設置該屬性
//報錯 Cannot assign to 'name': the setter is private in 'Person
}

class Person {
    var name = "小明"
        private set
    var age = 20
}

2)自定義訪問器

當有需求只能設置小於150的年齡
在該屬性下增加 set()方法

fun main(args: Array<String>) {
    val person = Person()
    person.age=190
    println(person.age )
    println(person.name)
}

class Person {
    var name = "張峯"
    var age = 20
        set(value) {
            if (value < 150) {
                //切記使用field
                field = value
            }else{
                println("年齡太大了")
            }
        }
}
2、構造函數

1)構造函數

kotlin構造函數:
構造函數不帶var的那種(name:String,age:Int) 只能往裏面傳參數;
帶var那種(var name:String,var age:Int)相當於setter 和getter

fun main(args: Array<String>) {
val person=Person1("呵呵",30)
    println(person.age)

}

class Person1(var name: String,var age: Int) {

}

2)構造函數參數的使用

使用init關鍵字

class Person11(name: String, age: Int) {
    var name = ""
    var age: Int = 0

    //構造函數中的代碼可以放到init中執行
    init {
        this.name = name
        this.age = age
    }
}

3)次構造函數

主構函數和次構函數順序,先走主構函數 —>次構函數

fun main(args: Array<String>) {
    var person = Person3("大頭", 22, "13132421")
}

//次構函數即重載
class Person3(var name: String, var age: Int) {
    init {
        println("走了主構函數")
    }

    var phone = ""

    constructor(name: String, age: Int, phone: String) : this(name, age) {
        println("走了次構函數")
        this.phone = phone
    }
}
3、繼承

kotlin的類都是 final的 不能被繼承所以父類要是用open關鍵字

fun main(args: Array<String>) {
val son=Son()
    println(son.age)
    println(son.name)
   son.habit()
}
open class Father{
   open var name="hehe"
    open var age=25
    //動態行爲
    open fun habit(){
        print("呵呵喜歡抽菸")
    }

}

//子繼承父業
class Son:Father(){
    override var name: String="didi"
    override var age: Int=10
    override fun habit() {
//        super.habit()
        println("我不愛抽菸")
    }
}
4、抽象類

抽象類:反映的是事物的本質
說明:
(1)抽象類裏面可以沒有抽象方法和抽象屬性
(2)並且方法和屬性可以具體實現
(3)抽象類可繼承抽象類,抽象類只能單繼承

fun main(args: Array<String>) {
    val zh = Chinese()
    println(zh.color)
    println(zh.language)
    zh.eat()
    val usa = Chinese()
    println(usa.color)
    println(usa.language)
    usa.eat()
    val af = Chinese()
    println(af.color)
    println(af.language)
    af.eat()
}

//定義人類抽象類
abstract class Human {
    //人類共同屬性

    //膚色
    abstract var color: String
    //語言
    abstract var language: String

    //吃飯
    abstract fun eat()

}

open class Chinese : Human() {
    override var color: String = "黃色"
    override var language: String = "中文"

    override fun eat() {
        println("吃飯用筷子")
    }
}

class American : Human() {
    override var color: String = "白色"
    override var language: String = "英語"

    override fun eat() {
        println("吃飯用刀叉")
    }
}

class African : Human() {
    override var color: String = "黑色"
    override var language: String = "葡萄牙語"

    override fun eat() {
        println("吃飯用手")
    }
}
5、接口

1)接口

接口:接口反映的是事物的能力
描述:接口可以進行多實現

fun main(args: Array<String>) {
    val xiaoming = XiaoMing()
    xiaoming.eat()
    println(xiaoming.language)
    xiaoming.ride()

}

//小明
class XiaoMing : Chinese(), RideBike, DriveCar {
    override fun drive() {

        println("小明學會了開車")
    }

    override fun ride() {
        println("小明學會了騎自行車")
    }

}

//能力使用接口表示
interface RideBike {
    fun ride()
}

interface DriveCar {
    fun drive()
}

2)接口細節

接口細節:java中接口裏面可以具體實現,kotlin不行;
描述: java中接口方法是不能實現的 kotlin 是可以實現的。

fun main(args: Array<String>) {
    val xiaoming = XiaoMing()
    xiaoming.eat()
    println(xiaoming.language)
    xiaoming.ride()
}
//小明
class XiaoMing : Chinese(), RideBike, DriveCar {
    override val licenseNumber: String="1425646476"
    override fun drive() {

        println("小明學會了開車")
    }

    override fun ride() {
        println("小明學會了騎自行車")
    }

}

//能力使用接口表示
interface RideBike {
    fun ride()
}

interface DriveCar {
    //車牌
//    val licenseNumber="12432132"
    val licenseNumber: String

    fun drive(){}
}
6、多態

描述:通過父類的接收 執行的是子類的方法

fun main(args: Array<String>) {
    val dog:Animal = Dog()
    dog.let {
        println(it.color)
        it.call()
    }
    val cat = Cat()
    cat.let {
        println(it.color)
        it.call()
    }
}

//定義動物類
abstract class Animal {
    var color: String = ""
    //行爲
    abstract fun call()
}

//狗
class Dog : Animal() {
    override fun call() {
        println("狗汪汪叫")
    }

}

//貓
class Cat : Animal() {
    override fun call() {
        println("貓喵喵叫")
    }

}
發佈了60 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章