笔记: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)
    }
    

推荐阅读更多精彩内容