Kotlin构造函数与单例

Kotlin构造函数与单例

前言

  • 类是同一类事物的高度抽象的,不实际存在的(不会占内存)的概念
  • 对象是类的实例化,现实化(具体存在,完成具体任务<存值,执行>)
  • 存值:成员变量,属性变量
  • 执行:行为,方法


为什么要有构造函数?

  1. 默认的无参构造函数

    类本身不知道如何创建⾃⼰的对象,对象本身是由顶层类来构建,再由当前这个类来初始化那个对象

  2. 重载的有参构造⽅法

    1. 为了⽅便给初始化值
    2. 在创建对象的同时给予某些需要的数据(时机)


单例对象

单例对象概念

当我们巧妙使⽤private来私有化构造⽅法,给外部提供⼀个单例对象(整个程序运⾏中这个类只有⼀个对象)

如何得到单例对象

Java

  1. 私有化构造⽅法 -> 使外部⽆法创建这个类的对象

    private Animal(){} 
    
  1. 类内部提供⼀个静态的成员属性 -> 静态变量只会初始化⼀次

    public static Animal instance = new Animal();
    
  1. 给外部提供⼀个静态⽅法 -> 获取这个对象

    注意: 此处未考虑内存消耗和线程安全

    public static Animal getInstance(){ return instance; }
    
  1. 外部获取这个对象

    Animal.getInstance();
    

注意:系统类库中以下开头的⽅法通常都是提供单例

  • instance
  • shared
  • default


Kotlin

class Animal private constructor(){ // kotlin单例不完善版本
    companion object{
        private val defaultInstance = Animal()
        fun getInstance(): Animal {
            return defaultInstance
        }
    }
}
class Animal private constructor() {    // kotlin单例一般写法
    companion object {
        val sharedAnimal: Animal by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
            Animal()
        }
    }
}


Kotlin构造函数

  1. 主构造函数

    • 创建⼀个没有主体的类

      class Person 
      
  • 显示指定构造⽅法

    class Person2 constructor() 
    
  • 主构造函数需要传递⼀个字符串对象 constructor不能省略

     class Person3 constructor(var name:String) 
    
  • 有修饰符限定构造函数权限时 constructor不能省略

    class Person4 private constructor() 
    
  • 如果有⽗类,必须直接调⽤⽗类的构造函数

    open class Father 
    class Person5 : Father() 
    
  • 如果⽗类有参数 ⼦类必须提供相应有参的构造函数

    open class Father2 constructor(name: String) 
    class Person6 constructor(name: String) : Father2(name) 
    


  1. 次构造函数

    • constructor(name:String) : this(){} 
      // 注意:a.次构造函数必须直接调⽤主构造函数 
      //     b.如果有⽗类,必须调⽤⽗类的构造函数 
      
  • 次构造函数必须继承主构造函数
 ```kotlin
 class Person7(name: String) { 
     constructor(name: String, age: Int): this(name)
 } 
 ```
  • 次构造函数只需要考虑和主构函数的关系

    open class Father3 constructor(name: String)
    
    class Person8 constructor(name: String) : Father3(name){ 
       constructor(name: String, age: Int):this(name) 
    }
    
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容