1. object Singleton {
  2. var x:Int=2
  3. }
  • 饿汉式,加载时实例化

在 Kotlin 访问

fun main() {
    val singleton = Singleton //创建没有括号 Singleton()
    println(singleton.x)
}

区别普通 class 类,创建无需中括号

在 Java 访问

    public static void main(String[] args) {
        System.out.println(Singleton.INSTANCE.getX());
    }

@JvmStatic

kotlin因为要兼容多个平台,没有Java中 static 修饰符,只能通过注解实现

object Singleton {
    @JvmStatic
     var x:Int=2
}

使用注解后再 Java 中访问,与Java访问静态成员相同,通过类名直接访问getter。

    public static void main(String[] args) {
        System.out.println(Singleton.getX());
    }

@JvmField

object Singleton {
    @JvmField
     var x:Int=2
}

不需要调用getter

System.out.println(Singleton.x);

限制

@JvmStatic 只能用在 object 和 伴生对象 companion object

@JvmField 可以用在普通class ,但生成非静态的 不同用类名直接访问

class Personal {
    @JvmStatic
    var x: Int = 2 //编译报错

    @JvmField
    var y: Int = 6 //编译正常,但生成非静态的
}
class Personal {
    companion object{
        @JvmStatic
        var x: Int = 22 //编译正常,生成静态的
    }

    @JvmField
    var y: Int = 66 //编译正常,但生成非静态的
}
  println(Personal.x)
  println(Personal().y)

object 不能定义构造器

  • 可以定义init