筆記:kotlin 學習第三天

  1. kotlin - get和set

    /**
     * @ 文件名:   `1.get和set`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 09:41
     * @ 描述: kotlin中的字段默認是私有的,get和set方法是自動生成的
     */
        fun main(args: Array<String>) {
        val person = Person()
        person.say()
        println(person.name)
        println(person.age)
    }
    
    open class Person {
        var name: String = "林志玲"
    
        var age = 19
    
        fun say() {
            println("高德地圖持續為您服務")
        }
    }
    
  2. kotlin - 訪問器 private set

    /**
     * @ 文件名:   `02.訪問器`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 09:47
     * @ 描述:    通過private set 設置可以私有set或者get方法
     */
    fun main(args: Array<String>) {
        val user = User()
    
        println(user.login(user.phone, user.password))
    }
    
    class User {
        //private //寫在上面表示set 和 get 方法都會生成
        var phone: String = "110"
        private set//私有化set:private final void setPhone(String var1) {this.phone = var1; }
    
        var password: String = "12345"
    
        fun login(phone: String, pwd: String): String {
            return phone + pwd
        }
    }
    
  3. kotlin - 自定義訪問器 set(){} this.age field

    /**
     * @ 文件名:   `03.自定義訪問器`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 09:51
     * @ 描述:    set(){}  this.age會引起棧溢出,用field。
     */
    fun main(args: Array<String>) {
        val goods = Goods()
    
        goods.price = 20199
    
        println(goods.price)
    }
    
    class Goods {
        var name: String = "Mac"
    
        var price: Int = 18880
            set(price) {
                if (price > 20000) {
                    //this.price = price  遞歸調用導致棧溢出:if (price > 20000) {this.setPrice(price);}
                    field = price
                }
            }
    }
    
  4. kotlin - 構造函數

    /**
     * @ 文件名:   `04.構造函數`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 09:54
     * @ 描述:
     */
    fun main(args: Array<String>) {
        val address = Address("廣東省深圳市寶安區", "皮特", 10086)
        println(address.address + address.name + address.score)//廣東省深圳市寶安區皮特10086
    
    }
    
    class Address(address: String, name: String, score: Int) {
        var address: String = address
        var name: String = name
        var score: Int = score
    }
    
  5. kotlin - 構造函數參數使用 init

    /**
     * @ 文件名:   `05.構造函數參數使用_init`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 09:56
     * @ 描述:
     */
    
    fun main(args: Array<String>) {
        val item = Item("標題一", "https://www.baidu.com", 12315)
        println(item.title + item.url + item.id)
    }
    
    class Item(title: String, url: String, id: Int) {
        var title: String = ""
        var url: String = ""
        var id: Int = 10000
    
        init {
            this.title = title
            this.url = url
            this.id = id
        }
    
        //init 中的代碼會在構造函數中執行
        /*public Item(@NotNull String title, @NotNull String url, int id) {
            Intrinsics.checkParameterIsNotNull(title, "title");
            Intrinsics.checkParameterIsNotNull(url, "url");
            super();
            //默認定義的字段
            this.title = "";
            this.url = "";
            this.id = 10000;
            //init 塊中的代碼
            this.title = title;
            this.url = url;
            this.id = id;
        }*/
    }
    
  6. kotlin - 構造函數參數使用 var val

    /**
     * @ 文件名:   `06.構造函數參數使用var和val`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 09:58
     * @ 描述:
     */
    fun main(args: Array<String>) {
        val brand = Brand("奶粉", 12306)
        println(brand.name + brand.id)
        //brand.name = "電腦辦公"不能被重新賦值
    }
    
    class Brand(val name: String, var id: Int)
    
    //@NotNull
    //private final String name;
    //private int id;
    
  7. kotlin - 次構函數 constructor

    /**
     * @ 文件名:   `07.次構函數`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:01
     * @ 描述:
     */
    fun main(args: Array<String>) {
        val person = Person("林志穎", 18, "12345")
        val person1 = Person("林志玲", 30)
    
        println("person: ${person.phone}")
        println("person1: ${person1.phone}")
    }
    
    class Person(name: String, age: Int) {
        var phone: String = "10000"
    
        constructor(name: String, age: Int, phone: String) : this(name, age) {
            this.phone = phone
        }
    }
    
  8. kotlin - init和次構函數的執行順序

    /**
     * @ 文件名:   `08.init和次構函數的執行順序`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:02
     * @ 描述:
     */
    fun main(args: Array<String>) {
        val person = Person("王祖賢", 18,"12312")
        println(person.name)
        //執行了init初始化
        //執行了次構函數
        //王祖賢
    }
    
    class Person(var name: String, var age: Int) {
        init {
            println("執行了init初始化")
        }
    
        constructor(name: String, age: Int, phone: String) : this(name, age) {
            println("執行了次構函數")
        }
    }
    
  9. kotlin - 繼承 :

    /**
     * @ 文件名:   `09.繼承`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:26
     * @ 描述:
     */
    fun main(args: Array<String>) {
        val father = Father()
        father.eat()
        father.smoking()
    
        val son = Son()
        //son.name = "張四"
        //son.age = 19
        println(son.name + son.age)
        son.eat()
    }
    
    open class Father {
        open var name: String = "張三"
        open var age: Int = 39
    
        open fun eat() {
            println("父親喜歡吃米飯")
        }
    
        fun smoking() {
            println("父親喜歡抽煙")
        }
    }
    
    class Son : Father() {
        override var name:String = "張四"
        override var age:Int = 19
        override fun eat() {
            //super.eat()
            println("兒子喜歡吃面條")
        }
    }
    
  10. kotlin - 抽象類 abstract

    /**
     * @ 文件名:   `10.抽象類`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:27
     * @ 描述:
     */
     
    fun main(args: Array<String>) {
        val chinese = Chinese()
        chinese.say()
    
        val america = America()
        america.say()
    }
    
    abstract class Human {
        abstract var skinColor: String
        abstract var language: String
    
        abstract fun say()
    }
    
    class Chinese : Human() {
        override var language: String = "中文"
        override var skinColor: String = "黃色"
    
        override fun say() {
            println("中國人皮膚顏色是${skinColor},中國人講$language")
        }
    
    }
    
    class America : Human() {
        override var skinColor: String = "白色"
        override var language: String = "英語"
    
        override fun say() {
            println("美國人皮膚顏色是${skinColor},美國人講$language")
        }
    
    }
    
    
  11. kotlin - 接口

    /**
     * @ 文件名:   `11.接口`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:28
     * @ 描述:
     */
    fun main(args: Array<String>) {
        val peat = Peat()
        println(peat.name + peat.age)
        peat.drive()
    }
    
    abstract class Man {
        abstract var name: String
        abstract var age: Int
    }
    
    class Peat : Man(), Drive {
        override var name: String = "peat"
        override var age: Int = 18
    
        override fun drive() {
            println("peat學會了開車")
        }
    
    
    }
    
    interface Drive {
        fun drive()
    }
    
  12. kotlin - 接口細節 kotlin接口中的字段不能實現

    /**
     * @ 文件名:   `12.接口細節_字段`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:29
     * @ 描述:
     */
    fun main(args: Array<String>) {
        val peat = Peat()
        println(peat.name + peat.age + peat.license)
        peat.drive()
    }
    
    abstract class Man {
        abstract var name: String
        abstract var age: Int
    }
    
    class Peat : Man(), Drive {
        override val license: String = "10086"
        override var name: String = "peat"
        override var age: Int = 18
    
        override fun drive() {
            println("peat學會了開車")
        }
    
    
    }
    
    //開車能力
    interface Drive {
        //駕照號碼
        val license: String
    
        //開車行為
        fun drive()
    }
    
  13. kotlin - 接口細節 kotlin接口中的方法可以實現

    /**
     * @ 文件名:   `13.接口細節_方法`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:34
     * @ 描述:    kotlin 接口中的字段不能實現,但是方法可以實現。Java接口中的方法不能實現
     */
    fun main(args: Array<String>) {
        val peat = Peat()
        println(peat.name + peat.age + peat.license)
        peat.drive()
    }
    
    abstract class Man {
        abstract var name: String
        abstract var age: Int
    }
    
    class Peat : Man(), Drive {
        override val license: String = "10086"
        override var name: String = "peat"
        override var age: Int = 18
    
        //override fun drive()
    
    
    }
    
    //開車能力
    interface Drive {
        //駕照號碼
        val license: String
    
        //開車行為
        fun drive() {
            println("踩離合、掛擋、松離合、踩油門、走你")
        }
    }
    
  14. kotlin - 多態

    /**
     * @ 文件名:   `14.多態`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:36
     * @ 描述:
     */
    fun main(args: Array<String>) {
        val dog: Animal = Dog()
        val cat: Animal = Cat()
    
        dog.call()
        cat.call()
    
    }
    
    abstract class Animal {
        abstract var name: String
        open fun call() {
            println("動物叫")
        }
    }
    
    class Dog : Animal() {
        override var name: String = "旺財"
    
        override fun call() {
            println("${name}汪汪叫")
        }
    
    }
    
    class Cat : Animal() {
        override var name: String = "Tom"
    
        override fun call() {
            println("${name}喵喵叫")
        }
    
    }
    
  15. kotlin - 智能類型轉換 is

    /**
     * @ 文件名:   `15.智能類型轉換`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:36
     * @ 描述:    kotlin 中不需要強轉,智能類型推斷
     */
    
    fun main(args: Array<String>) {
        val shepHerdDog: Dog = ShepHerdDog()
        val ruralDog: Dog = RuralDog()
    
        if (shepHerdDog is ShepHerdDog) {
            val herdDog = shepHerdDog as ShepHerdDog//沒有轉換的必要
            herdDog.herdSheep()
        }
    
        if (ruralDog is RuralDog) {
            ruralDog.watchDoor()
        }
    }
    
    abstract class Dog
    
    class ShepHerdDog : Dog() {
        fun herdSheep() {
            println("牧羊犬的作用是放羊")
        }
    
    }
    
    class RuralDog : Dog() {
        fun watchDoor() {
            println("中華田園犬的作用是看家")
        }
    }
    
  16. kotlin - 嵌套類 嵌套類是靜態的

    /**
     * @ 文件名:   `16.嵌套類`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:37
     * @ 描述:
     */
    
    fun main(args: Array<String>) {
        val innerClass = OutClass.InnerClass()//inner類是靜態的:public static final class InnerClass
        println(innerClass.name)
        innerClass.sayHello()
    
        val outClass = OutClass()
        println(outClass.name)
    }
    
    
    class OutClass {
        var name: String = "out"
    
        class InnerClass {
            var name: String = "inner"
    
            fun sayHello() {
                println("你好$name")//訪問的inner類的name字段
            }
        }
    }
    
  17. kotlin - 內部類 inner class

    /**
     * @ 文件名:   `17.內部類`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:38
     * @ 描述:    inner 關鍵字可以去掉static屬性
     */
    fun main(args: Array<String>) {
        val innerClass = OutClass().InnerClass()//public final class InnerClass
        innerClass.sayHello()
    }
    
    class OutClass {
        var name: String = "out"
    
        inner class InnerClass {
            var name: String = "inner"
            fun sayHello() {
                println("say 你好 $name")
            }
        }
    }
    
  18. kotlin - 內部類中使用this this@OutClass.name

    /**
     * @ 文件名:   `18.內部類使用this`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:40
     * @ 描述:    內部類和Java一樣需要依賴外部類對象環境。this@tag 和 Java中的OutClass.this.name 一樣
     */
    fun main(args: Array<String>) {
        val innerClass = OutClass().InnerClass()
        innerClass.sayHello()
    }
    
    class OutClass {
        var name: String = "out"
    
        inner class InnerClass {
            var name: String = "inner"
            fun sayHello() {
                println("say 你好 ${this@OutClass.name}")
            }
        }
    }
    
  19. kotlin - 泛型 <T> T

    /**
     * @ 文件名:   `19.泛型`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:40
     * @ 描述:
     */
    fun main(args: Array<String>) {
    
        val apple = Apple()
        val orange = Orange()
        val box = FruitBox(apple)//定義的水果箱子可以放??和??
        //val sonBox = SonBox<Apple>(orange)//定義的??箱子不能放入??,只能放入??
        val sonBox = SonBox<Apple>(apple)
    
    }
    
    
    //定義一個水果類
    abstract class Fruit
    
    //定義一個??類
    class Apple : Fruit()
    
    //定義個橘子??類
    class Orange : Fruit()
    
    
    //定義一個不知道裝什么東西的箱子
    open class Box<T>(var thing: T)
    
    //不知道具體放什么東西,前面聲明,后面兩個都是 使用
    class SonBox<T>(thing: T) : Box<T>(thing)
    
    //水果箱子
    class FruitBox(thing: Fruit) : Box<Fruit>(thing)
    
  20. kotlin - 泛型函數 <T> T

    /**
     * @ 文件名:   `20.泛型函數`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:42
     * @ 描述:
     */
    fun main(args: Array<String>) {
        add("a")//[a]
        add(12)//[12]
        val dog = Dog()
        add(dog)//[com.ty.ktolin.day03.Dog@49476842]
    }
    
    //定義一個函數,參數泛型為T
    fun <T> add(item: T) {
        val listOf = arrayListOf<T>()
        listOf.add(item)
        println(listOf)
    }
    
  21. kotlin - 泛型上限 T:Fruit

    /**
     * @ 文件名:   `21.泛型上限`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:43
     * @ 描述:
     * 定義對象的時候使用泛型
     * 定義子類時候執行泛型
     * 定義子類的時候不知道具體類型,繼續使用泛型
     * T:Fruit  泛型上限  泛型智能是Fruit類型或者Fruit類型的子類
     * 泛型作用:放任何類型 限制存放的類型
     */
    fun main(args: Array<String>) {
        val two = Two()
        val three = Three()
        val four = Four()
    
        val five = Five(two)
        val five1 = Five(three)
        //val five2 = Five(four)
    }
    
    abstract class One
    
    open class Two : One()
    
    class Four : One()
    
    class Three : Two()
    
    class Five<T : Two>(var num: T)
    
  22. kotlin - 泛型擦除 泛型前加reified 方法前inline

        /**
     * @ 文件名:   `22.泛型擦除`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:48
     * @ 描述:
     * 兩種類型應該是不一樣的
     * 必須要通過反射獲取泛型類型
     *
     * 解決泛型擦除方案:
     * 第一步:泛型前加reified關鍵字
     * 第二步:方法前加上inline關鍵字
     */
    
    fun main(args: Array<String>) {
        parseType("a")
    }
    
    inline fun <reified T> parseType(thing: T) {
        //獲取傳遞的thing的class類型
        val name = T::class.java.name
        println(name)
    }
    
  23. kotlin - 泛型類型投射 out Fruit in Fruit

        /**
     * @ 文件名:   `23.泛型類型投射`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:49
     * @ 描述:
     * in:接收當前類型或者它的父類  相當于java的 ? super
     * out:接收當前類型或它的子類 相當于java的 ? extents
     */
    
    fun main(args: Array<String>) {
        val arrayList = ArrayList<Fruit>()
        val apple = Apple()
        val fushiApple = FushiApple()
    
        arrayList.add(apple)
        arrayList.add(fushiApple)
    
        setFruitList(arrayList)
        //addFruitList(arrayList)
    
    }
    
    //能裝富士蘋果以及他的父類
    fun setFruitList(list: ArrayList<in FushiApple>) {
        println(list.size)
    }
    
    //只能裝富士蘋果以及他的子類
    fun addFruitList(list: ArrayList<out FushiApple>) {
        println(list.size)
    }
    
    //定義一個水果類
    abstract class Fruit
    
    //定義一個??類
    open class Apple : Fruit()
    
    //定義一個富士??類
    class FushiApple : Apple()
    
  24. kotlin - 星號投射 *

        /**
     * @ 文件名:   `24.星號投射`
     * @ 創建者:   ty
     * @ 時間:    2018/7/14 10:50
     * @ 描述:    *可以傳遞任何類型  相當于java的 ?
     */
    fun main(args: Array<String>) {
        val arrayList = ArrayList<Int>()
        arrayList.add(111)
        add(arrayList)
    
        val list = ArrayList<String>()
        list.add("abc")
        add(list)
    }
    
    fun add(list: ArrayList<*>) {
        println(list.size)
    }
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容