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() }