Kotlin学习之路---二 面向对象

1.抽象类和接口

类和属性默认都是final的,想要被继承或复习,必须open

接口,接口方法,抽象类默认为open

接口方法可以有默认实现

by:接口代理

代码示例

class Manager:Driver,Write{
    override fun write() {
    }

    override fun drive() {
    }

}

//by:接口代理
class SeniorManager(val driver: Driver,val write: Write):Driver by driver,Write by write


class CarDriver:Driver{
    override fun drive() {
        System.out.print("开车呢")
    }
}

class PPTWrite:Write{
    override fun write() {
        System.out.println("做PPT呢")
    }
}

interface Driver{
    fun drive()
}

interface Write{
    fun write()
}

fun main(args: Array<String>) {
    val driver = CarDriver()
    val write = PPTWrite()
    val seniorManager = SeniorManager(driver,write);
    seniorManager.drive()
    seniorManager.write()
}

2。Object:只有一个实例的类,不能自定义构造方法,可以实现接口,继承父类,本质上就是单例模式最基本的实现

class Drive

interface OnExternalDriverMountListener{
    fun onMount(drive:Drive)

    fun onUnmount(drive: Drive)
}

abstract class Player

object MusicPlayer : Player(), OnExternalDriverMountListener{
    override fun onMount(drive: Drive) {
    }

    override fun onUnmount(drive: Drive) {
    }

    val state: Int = 0

    fun play(url:String){

    }
    fun stop(){

    }
}

调用:

MusicPlayer.INSTANCE.getState();

3.半生对象和静态成员

每个类可以对应一个伴生对象

半生对象的成员全局独一份,类似Java的静态成员

JvmFiled和JvmStatic的使用

fun main(args: Array<String>) {
    val latitude = Latitude.ofDouble(30.0)
    val latitude2 = Latitude.ofLatitude(latitude)
    Latitude.TAG
}

class Latitude private constructor(val value:Double){
    //静态方法
    companion object {//伴生对象
        @JvmStatic//加注解java可以直接调用
        fun ofDouble(double:Double):Latitude{
            return Latitude(double)
        }
        
        fun ofLatitude(latitude: Latitude):Latitude{
            return Latitude(latitude.value)
        }
        //静态变量
        @JvmField//供Java代码调用
        val TAG = "Latitude"
    }
}

java调用:

Latitude latitude = Latitude.Companion.ofDouble(3.1);
Latitude latitude1 = Latitude.ofDouble(3.10);
Latitude.TAG;

4.扩展成员和扩展方法

    System.out.print("abc".multiply(5))//abc打印五遍
    System.out.println("abc" * 5)

operator fun String.times(int: Int):String{
    val stringBuffer:StringBuffer = StringBuffer()
    for (i in 0 .. int){
        stringBuffer.append(this)
    }
    return stringBuffer.toString()
}

fun String.multiply(int:Int):String{
    val stringBuffer:StringBuffer = StringBuffer()
    for (i in 0 .. int){
        stringBuffer.append(this)
    }
    return stringBuffer.toString()
}

猜你喜欢

转载自blog.csdn.net/u010652002/article/details/82932005