给已有的类去额外添加函数和属性,而且既不需要改源码也不需要写子类
扩展函数不可以被重写
扩展函数的作用域
1、全局
新建一个file文件,名字随便写就叫T吧
T文件
package com.xxx.xxx
fun Int.sumTest(num:Int):Int{
return this+num //this表示E文件中的a
}
E类文件
private val a:Int=5
val sum:Int //常量类型要与T文件中的接受类型(T文件中sumTest左边的Int)一样才可以调用方法
get() {
return a.sumTest(5)
}
查看 kotlin 文件的字节码,然后再 Decompile 为 Java 代码。上面我们为 Person 扩展函数转为Java代码后大概如下。
public final class T{
public static final void sumTest(@NotNull T $this$sumTest) {
Intrinsics.checkParameterIsNotNull($this$sumTest, "$this$sumTest");
}
}
由此可见扩展函数是通过创建外部文件+静态方法来实现
java调用
T.sumTest(new E());
2、局部
在同一个类文件中就行了
扩展属性
val Person.age: Int
get() = currentYear - this.birthdayYear
上面我们声明的是一个 val,当然也可以声明一个 var,不过 var 的话需要同时定义其 get 和 set 方法。