比如class person 是一个父类,class student是person的子类。他们都有一个扩展方法为printName(),在我们实际应用中往往会利用面向对象的多态特性(父类引用指向具体的子类)。这时调用的扩展方法是父类的而不是具体子类的,如下: class Person class Student fun Person.printName(){ println("person class name is ....
1、Class 静态初始化块: 在Kotlin的单例对象被第一次引用时,它会触发一个静态初始化块来创建这个对象的实例。这类似于Java中的静态初始化块。 2、线程安全: object关键字生成的单例是线程安全的。这是通过JVM的类加载机制保证的,JVM会确保类的静态初始化块在多线程环境中只会被执行一次。 3、饿汉式单例: 从...
classSingletonprivateconstructor(privateval param:Int){companion object{@Volatileprivatevarinstance:Singleton?=nullfungetInstance(property:Int)=instance?:synchronized(this){instance?:Singleton(property).also{instance=it}}} 说到这,你应该了解了object实现单例模式的本质。下面来看看伴生对象。 伴生对象 你可以回...
data class最大的特色在于copy函数和多变量赋值,可以在一条语句里面把不同的字段赋值给不同的变量. 运行结果如下: Kotlin一般在类中不允许static成员,前面曾经说过可以使用companion object来创建一个伴生对象从而可以使用static成员. 这里还有一种方法就是使用object关键字声明一种特殊的类,这个类只有一个实例,因此看...
by lazy by关键字在kotlin中表达的委托的概念,by lazy只是会在使用到的时候进行初始化(类似懒汉式的单例),使用代理的方式调用get/set方法,所以var 不能声明by lazy修饰的属性 classUserprivateconstructor(){companionobject{valinstance:Userbylazy{User()}}}...
object Util { fun doSomething() { // ... } } fun main(args: Array<String>) { Util.doSomething() // ... } 枚举 在Kotlin 中,使用 object 关键字定义枚举,只需要在 object 关键字后面添加 enum class 关键字即可。 enum class Color { RED, GREEN, BLUE } fun main(args: Array<String>...
public class SingleCase private constructor() { companion object { val instance: = SingleCase () } } 1. 2. 3. 4. 5. //带参数 class SingleCase private constructor(str: String) { var string: String = str; companion object { @Volatile ...
只能用于顶层的class中,比如 object class 或者 companion object; 只能用于基本类型; 不会生成get方法。 3.2 JvmField 如果我们 某个字段不是 val 标注呢,其是 var (可变)修饰的呢,并且这个字段要对外暴漏(非 private )。此时不难猜测,相应的字节码后肯定会同时生成 set 与 get 方法。
classApp:Application() { companionobject{ privateconstvalTAG ="App" lateinitvarapp: App privateset } // 如果应用中有 ContentProvider 并使用了 App 单例对象 // 则需要在 这个函数中初始化单例对象而不是 onCreate 函数 overridefunattachBaseContext(base:Context?){ ...