1、使用object声明类似java中的静态内部类
interface Moveable{
fun move(){
}
}
class Outer{
private var a:String?=null
//被编译成静态内部类
object c:Moveable{
override fun move() {
//接口的默认实现
super.move()
//静态内部类无法访问外部内非静态变量
//print(a)
}
}
}
编译后生成的class文件
使用 jad 将class文件转java
jad -s .java Outer.class
public final class Outer
{
public static final class c
implements Moveable
{
public void move()
{
Moveable.DefaultImpls.move(this);
}
public static final c INSTANCE = (c)this;
static
{
new c();
}
private c()
{
}
}
public Outer()
{
}
private String a;
}
jad -s .java Moveable.class
public interface Moveable
{
public static final class DefaultImpls
{
public static void move(Moveable moveable)
{
}
}
public abstract void move();
}
jad -s .java Moveable$DefaultImpls.class
public static final class Moveable$DefaultImpls
{
public static void move(Moveable moveable)
{
}
}
jad -s .java Outer$c.class
public static final class Outer$c
implements Moveable
{
public void move()
{
.DefaultImpls.move(this);
}
public static final Outer$c INSTANCE = (Outer$c)this;
static
{
new Outer$c();
}
private Outer$c()
{
}
}
2、使用object声明类似java中的匿名内部类
interface Moveable{
fun move(){
}
}
class Outer{
private var a:String?=null
//被编译成匿名内部类
private var c = object:Moveable {
override fun move() {
//接口的默认实现
super.move()
print(a)
}
}
}
编译后生成的class文件
public static final class Outer$c$1
implements Moveable
{
public void move()
{
efaultImpls.move(this);
String s = Outer.access$getA$p(Outer.this);
System.out.print(s);
}
final Outer this$0;
Outer$c$1(Outer $outer)
{
this$0 = $outer;
super();
}
}
public final class Outer
{
public Outer()
{
c = new Moveable(this) {
public void move()
{
Moveable.DefaultImpls.move(this);
String s = a;
System.out.print(s);
}
final Outer this$0;
{
this$0 = $outer;
super();
}
}
;
}
private String a;
private c._cls1 c;
}
3、使用object声明单例对象
object Singleton{
fun f1() {
}
fun f2() {
}
}
java代码
public final class Singleton
{
public final void f1()
{
}
public final void f2()
{
}
private Singleton()
{
}
public static final Singleton INSTANCE = (Singleton)this;
static
{
new Singleton();
}
}
网友评论