Kotlin学习笔记——基础语法篇之类和对象

2019-03-29  本文已影响0人  Jingtianer

类的构造

Kotlin类的写法

  1. Kotlin类的构造函数分为主构造函数和二级构造函数
  2. 主构造函数的特点——函数名为init,参数要写在类名后面(下面举例),一般用于初始化
  3. 如果要在java中调用kotlin的类,要在类名前面加上@JvmOverloads(让java能够识别默认参数),并且补充constructor关键字
  4. 主构造函数的参数写在类名后,如果没有@JvmOverloads修饰,constructor关键字可省略(不是指二级构造函数的constructor,是类名后面的)
  5. 二级构造函数用constructor关键字
  6. 二级构造函数的特点——可有可无,相互独立,如果有主构造函数,先调用主构造函数

例子

    class Animal (type:String = "动物", name:String) {
        //没有@JvmOverloads修饰,可以省略constructor
        //等价以下写法
    //class Animal constructor(type:String = "动物", name:String) {
        var Type:String = ""
        var Name:String = ""
        var Age:Int = 0
        var Sex:String = ""
        init {
            Type = type
            Name = name
        }
        constructor(type:String = "动物", name:String, age:Int, sex:String) : this(type, name){
            Age = age
            Sex = sex
        }

    }

类的成员

类的成员属性

观察上述代码,构造函数传入的参数和成员变量一一对应,对于这些变量,Kotlin提供简便写法,在参数名之前加上valvar

例子

    class Animal (var type:String = "动物", var name:String) {
        //只有主构造函数中才可以有成员属性
        var sex:Int = 0
        var age = 0
        constructor(type:String = "动物", name:String, age:Int, sex:Int) : this(type, name){
            this.sex = sex
            this.age = age
        }

    }
    //到时候可以直接调用成员变量type,name等

伴生对象和静态属性

想要让类具有类似java中静态成员函数和静态成员变量,要用到伴生对象,相当于java中的static代码块儿

例子

class Animal (var type:String = "动物", var name:String) {
    var sex:Int = 0
    var age = 0
    constructor(type:String = "动物", name:String, age:Int, sex:Int) : this(type, name){
        this.sex = sex
        this.age = age
    }
    companion object StaticMembers {
        val MALE:Int = 0
        val FEMALE:Int = 1
        val UNKNOWNSEX:Int = 2
        val UNDIFINEDSEX:Int = 3
        fun sexToString(sex:Int):String {
            return when(sex) {
                MALE -> "Male"
                FEMALE -> "Female"
                UNKNOWNSEX -> "UnKnownSex"
                UNDIFINEDSEX -> "UnDefindSex"
                else -> "Invalid input"
            }
        }
    }
}

类的继承

在Kotlin中,默认情况下,类是不允许被继承的,成员函数也是不允许重写的,只有加上open修饰符,被修饰的类才可以被继承,被修饰的函数才可以被重写,Kotlin的类和函数默认相当于java的final类和方法

Kotlin中的开放性修饰符

开放性修饰符 说明
public 对所有人开放,Kotlin的类、函数变量不加修饰全部都是public
internal 对于本模块开放
protected 对于自己和子类开放
private 私有,不能和open一起使用

抽象类

写法:

    abstract class demo() {
        abstract fun func1():Int
    }

接口

    interface interDemo {
        fun func1():String
        fun func2():String {
            return "I'm tired"
        }
    }

注意

  1. Kotlin不允许多继承,通过接口来间接实现多继承
  2. 抽象类不能定义对象
  3. kotlin允许在接口内部实现某个方法
  4. 接口内部的所有方法默认都是open类型默认是抽象的
  5. 继承的时候,基类的成员属性不用加valvar

几种特殊的类

嵌套类

注意

  1. 嵌套类就是在类里面再写一个类
  2. 普通的嵌套类不能访问外部类的数据

例子

    class outerClass(var otrName:String = "outer name") {
        class innerClass(var inrName:String = "inner name") {
            fun getInfo():String {
                return "我的名字是:${inrName}"
            }
        }
    }

内部类

  1. 可以访问外部类数据的嵌套类
    class outerClass(var otrName:String = "outer name") {
        inner class innerClass(var inrName:String = "inner name") {
            fun getInfo():String {
                return "内部类的名字是:${inrName}\n外部类的名字是:${otrName}"
            }
        }
    }

枚举类和密封类

先不学

数据类

在类名前加上data修饰

特点

  1. 这种类自动生成每个字段的get和set方法
  2. equals方法,比较每一个数据
  3. 提供copy方法,用于复制数据对象
  4. 提供toSting方法

注意

  1. 必须有主构造函数,且至少一个参数
  2. 输入参数前面必须要加valvar
  3. 数据类不能是基类,不能是子类,不能是抽象类,不能是内部类,不能是密封类

模板类

类名后面添加</*泛型列表*/>,表示这是一个模板类

例子

    class MyArray<T> (var arr:Array<T>) {
        
    }
上一篇下一篇

猜你喜欢

热点阅读