object修饰class
- 下面是object修饰class的一个简单例子,就用object修饰 ObjTest,然后定义了一个 初始为0 的val i 和 一个str,还有一个go方法
object ObjTest {
val i = 0
val str = "hello"
fun go() {
val str = "am go"
println("我是go方法")
}
}
接下来我们看一下反编译成的java代码是什么样子。
public final class ObjTest {
private static final int i = 0;
@NotNull
private static final String str = "hello";
public static final ObjTest INSTANCE;
public final int getI() {
return i;
}
@NotNull
public final String getStr() {
return str;
}
public final void go() {
String str = "am go";
String var1 = "我是go方法";
System.out.println(var1);
}
static {
ObjTest var0 = new ObjTest();
INSTANCE = var0;
str = "hello";
}
}
通过java代码我们可以发现,object修饰的类反编译成java代码以后,是一个final修饰的class,final修饰不能被继承,同时int i 和 str 两个变量被 static final修饰,并且只提供了get方法,并且public static final ObjTest INSTANCE; ,在静态代码块中初始化了INSTANCE实例,这是一个单利模式的class。
所以,object修饰的class,修饰不能被继承,其成员变量为静态且final且不可修改,方法也为final修饰
在Kotlin中调用如下
val clazz = ObjTest
java中调用方式如下
ObjTest objTest = ObjTest.INSTANCE;
objTest.go();
objTest.getI();
object修饰匿名内部类
object Test {
@JvmStatic
fun main(args: Array<String>) {
val kClazz = KClazz()
kClazz.go(object : IObjListener {
override fun o() {
}
})
}
}
同样看一下反编译成的java代码
public final class Test {
public static final Test INSTANCE;
@JvmStatic
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
KClazz kClazz = new KClazz();
kClazz.go((IObjListener)(new IObjListener() {
public void o() {
}
}));
}
static {
Test var0 = new Test();
INSTANCE = var0;
}
}
object就是其中的(IObjListener)