object Singleton {
var x:Int=2
}
- 饿汉式,加载时实例化
在 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