companion object {
@JvmField var x: Int = 2
@JvmStatic fun y(){ }
}
}
注意,加的注解@JvmField
和@JvmStatic
只针对java平台的可用,其他平台并不可行。
单例的object类仍可以继承类:
object Singleton: Runnable{
override fun run() {
}
}
内部类:
在kotlin中类内部的class前面不写修饰符默认就是静态内部类,class前面写 inner修饰符才是java中的普通内部类,与java一样,普通内部类会持有外部类的对象引用。
class Outer {
//普通内部类 与java一样会持有外部类的引用
inner class Inner
//默认静态内部类
class StaticInner
}
fun main() {
val inner = Outer().Inner()
val staticInner = Outer.StaticInner()
}
object类内部的object类默认是静态的 不存在非静态的情况 不能定义成inner
object OuterObject {
//内部object默认是静态的 不存在非静态的情况 不能定义成inner
object StaticInnerObject
}
匿名内部类:
fun main() {
//匿名内部类
object : Cloneable {
}
}
其实就是object 省略类名直接实现接口。
匿名内部类 可用继承多个接口,java不行:
fun main() {
// 类型是混合类型:Cloneable & Runnable
val runnableCloneable = object : Cloneable, Runnable {
override fun run() {
}
}
}
实现多个接口时,它的类型是多个接口类型的混合类型。
Local class :
fun main() {
//本地函数
fun localFunc(){
println(“Hello”)
}
//对应Java的local class
class LocalClass: Cloneable, Runnable{
override fun run() {}
}
}
可以对比java的local class实现,其实就是在静态函数的内部定义一个类:
public class JavaInnerClasses {
public static void main(String… args) {
class LocalClass implements Cloneable, Runnable {
@Override
public void run() { }
}
}
}
说实话,写了这么多年代码,未曾这么干过。。
数据类:
kotlin中提供一个data
关键字,data
修饰的类就是一个数据类,对标java的bean类:
data class Book(val id: Long, val name: