类的定义

创建一个类

  1. class ClassKt {
  2. private var x:Int = 0
  3. }
  • 默认public
  • var x 必须初始化

构造方法

副(次)构造器 secondary constructor

class ClassKt {
    private var x:Int = 0
    constructor(x:Int){
        this.x=x
    }
}

constructor 构造器关键字,相当于java public ClassKt( ){}

主构造器

class ClassKt constructor(x: Int) {
    private var x: Int = 0
}

再简化的写法

class ClassKt constructor(var x: Int) {

}

再简化

class ClassKt (var x: Int) {

}

实例化调用

fun main() {
    val classKt = ClassKt(666)
    println(classKt.x)
}

接口的定义

创建接口

interface InterfaceKt {
    fun callBack()
}
  • 默认 public

接口实现

class SimpleClass : InterfaceKt {
    override fun callBack() {
    }
}
  • 通过冒号:加接口名称实现接口,这里冒号相当于 java implements

抽象类

创建抽象类

abstract class AbstractClass {
}
abstract class AbstractKt {
    abstract fun getList()
    open fun overridable() {}
    fun nonOverridable(){}
}
  • open 可以覆写该方法

继承抽象类

class Simple : AbstractKt() {
    override fun getList() {
    }

    override fun overridable() {

    }
}
  • 与接口一样通过冒号连接,区别在于继承对象后面加括号

属性

声明一个属性的完整语法是

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]
class PropertyKt(name: String, idCard: Int) {

    var name: String = name //property
        get() {
            return field
        }
        set(value) {
            field = value
        }


    val idCard: Int = idCard
        get() {
            return field
        }
    //没有set ,因为是只读 val
}
  • 通过 field 引用幕后字段( backing field )
  • 默认生成getter、setter
  • 只读属性 val 不允许 setter :::danger Java 中有field,没有property。可以理解kotlin property 等于Java field + get + set :::

java 中的field

public class LogTag {
    private String name;//field

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

属性引用

fun main() {
    val propertyKt = PropertyKt("java", 123)
    val nameRef = propertyKt::name
    nameRef.set("kotlin")
    println(nameRef.get())
}
  • 与函数引用一样通过 :: 连接