class.md

类和对象

目录:

类定义

class 类名{
    类体的内容
}

//空类
class Empty

//在类中定义成员函数
class a{
    fun b(){
        println("成员函数");
    }
}

类属性

class f{
    var a:Int=1
    val b:Int=2
}

//kotlin中没有new关键字
val c = f()

//使用 . 号来引用属性
c.a

class f constructor(a: Int) {}

var allByDefault: Int? // 错误: 需要一个初始化语句, 默认实现了 getter 和 setter 方法
var initialized = 1    // 类型为 Int, 默认实现了 getter 和 setter
val simple: Int?       // 类型为 Int ,默认实现 getter ,但必须在构造函数中初始化
val inferredType = 1   // 类型为 Int 类型,默认实现 getter

//使用 lateinit 关键字来描述属性
public class MyTest {
    lateinit var subject: TestSubject

    @SetUp fun setup() {
        subject = TestSubject()
    }

    @Test fun test() {
        subject.method()  // dereference directly
    }
}

例子:

class F{
    var a: String = ""
        get() = field   //将变量赋值后转换为大写
        set(value) {
            field = value.toUpperCase()
        }
    var b:Int=2
    	get()=field
    	set
}
fun main(args: Array<String>) {
    var f:F = F()
    f.a = "abc"
    
    println(f.a)
    println(f.b)
}

结果:
ABC
2

主构造器

class F constructor(a: Int) {
    init {
        println(a)
    }
    fun B() {
        println("类的函数")
    }
}

fun main(args: Array<String>) {
    val f=F(2)
    f.B()
}

结果:
2
类的函数

次构造函数

//使用 this 关键字代理另一个构造函数
class A(val name: String) {
    constructor (name: String, age:Int) : this(name) {
    }
}

//声明一个空的主构造函数
class B private constructor () {
}

例子:

class F constructor(a: Int) {
    init {
        println(a)
    }
    // 次构造函数
    constructor (a: Int, b: Int) : this(a) {
        println(a+b)
    }
    fun B() {
        println("类的函数")
    }
}

fun main(args: Array<String>) {
    val f=F(2,3)
    f.B()
}

结果:
2
5
类的函数

抽象类

open class Base {
    open fun f() {}
}

abstract class Derived : Base() {
    override abstract fun f()
}