Kotlin 面向对象

一、 类

Kotlin没有new关键字

默认修饰符是public

二、属性

 1.

fun main() {
    var a=A()
    println(a.name)
    println("===========")
    a.name="liu"
}

class A{
    //只读
    val age  get() = 10
    //
    var name ="tom"
    get() {
      println("调用name get属性")
        return field
    }
    set(value){
        println("调用name set属性")
        field=value
    }
}

 

 2.延迟初始化

可以在使用时,再分配内存空间

(1)

private lateinit var name: String

(2)

val name: Int by lazy { 1 }

三、构造方法

1.默认构造参数减少构造函数重载

fun main() {
    val stu1 = Student()
    val stu2 = Student(age = 20)
    val stu3 = Student(name = "lili")
    val stu4 = Student(age = 16, name = "lili")
}
//默认赋值
class Student(val age:Int=18,var name:String="tom"){

}

2.var val

如果类构造函数前没有使用var val,则它不会自动赋值给属性

没有带var val 的参数名,只能在init中使用

3.init语句块

创建对象时会自动执行init, init可以有多个

fun main() {
    val stu1 = Student()
}
class Student(val age:Int=18,var name:String="tom"){
    init {
        println(age)
    }
    init {
        println(name)
    }
}

4.次要构造方法

在类上定义的构造方法是主要构造,在类里定义的叫次要构造。

次要构造必须加上  constructor

fun main() {
    val stu1 = Student(18,"")
}
class Student  (){
    constructor(age:Int,name: String) :this (){

    }
}

次要构造必须调用主要构造

fun main() {
    val stu1 = Student(18,"Tom","852")
}
class Student  (age:Int){
    init {
        println(age)
    }
    constructor(age:Int,name: String) :this (age){
        println(name)
    }
    constructor(age:Int,name: String,code:String) :this (age,name){
        println(code)
    }
}

四、继承

 1.类默认下不能被继承

想要继承需要父类使用open关键字

fun main() {
    val stu1 = Student1(18)
}
open class Student  (age:Int){
    init {
        println(age+1)
    }
}
class Student1(age:Int):Student(age){

}

 2.super

如果子类没有主构造,则次构造使用super继承父类

fun main() {
    val stu1 = Student1(18)
}
open class Student  (age:Int){
    init {
        println(age+1)
    }
}
class Student1:Student{
    constructor(age:Int):super(age){
    }
}

如果继承了多个类和接口,并且他们又相同得方法名 

interface  A {
    fun test(){
        print("A")
    }
}

class B{
    fun test(){
        print("B")
    }
}

class C:A{
  override  fun test(){
        super<A>.test()
    }
}

3.重写父类方法

父类方法需要加open,并且子类加override 

open class Student  () {
    open fun test() {
        println("父类")
    }
}
class Student1:Student() {
    override fun test() {
        println("父类")
    }
}

4.final

五、接口

1.接口方法内可以实现

fun main() {
    B().test()
}
interface  A {
    fun test(){
        print("OK")
    }
}
class B:A{

}

2.

六、抽象类

七、伴生对象

Kotlin中不存在静态得概念,可以使用 companion object {} 

fun main() {
    println(A.a)
    A.test()
}

class A{
    companion object {
        val a=10
        fun test(){
            print("fun")
        }
    }
}

一个类中只允许定义一个伴生对象

编译器给 companion object 默认加上一个名字companion

编译后

八、扩展

fun main() {
    A().test2()
}
class A{
    fun test1(){
        println("test1")
    }
}
fun A.test2(){
    println("test2")
}

九、多态

十、数据类

 主构造至少要有一个参数

所有得主构造参数都必须要有 var或者val

数据类不能是抽象的,open的、sealed的、inner的

fun main() {
    var a=A(18,"tianjin")
    print(a)
}

data class A(var age:Int,val address:String)

十一、密封类

限制只能传入子类

 

十二、嵌套类、内部类

原文地址:https://www.cnblogs.com/buchizaodian/p/12611482.html