伴生类和单例对象

创建对象的方式:

    1. class → new
    1. 直接通过object来定义(单例对象,只有一个,孤单) 适用于数据存储,提供一些工具方法,公用方法......
kotlin 复制代码
package level02{

  object class06 {

    object Myschool {
      val name: String = "xxx学校"

      def say(): Unit = {
        println(s"say:${name}")
      }
    }

    def main(args: Array[String]): Unit = {
      // 访问对象的属性
      //println(Myschool.name)
      // 调用对象的方法
      Myschool.say()
    }
  }

}

伴生类和伴生对象

  • 类和对象同名,且在同一文件中,此时,他们互为伴生关系。
  • 特点:可以互相访问对方的私有成员
typescript 复制代码
package level02

object class07 {
    class Student(private val password: String) {
      private def validatePassword(input: String): Boolean = {
        input == password
      }
    }

    object Student {
      def check(stu: Student, pwd: String): Boolean = {
        stu.validatePassword(pwd)
      }
    }

    def main(args: Array[String]): Unit = {
      val stu1 = new Student("12345")
      if (Student.check(stu1, "12345")) {
        println("验证通过")
      }

      // 类外部无法访问私有成员,以下代码会编译错误
      // if (stu1.validatePassword("12345")) {
      //   println("验证通过")
      // }
    }
}

单例模式:一个类(class)只能有一个对象!

  • 步骤:
  1. 不让它new:把构造函数设置为私有的!
  2. 在伴生对象中调用new来生成一个对象;提供一个方法来获取这个对象
kotlin 复制代码
package level02

object class08 {
  // 构造函数私有,外部无法直接new
  class Student private(var name: String, var age: Int) {
  }

  object Student {
    // 伴生对象中创建唯一实例
    private val ins = new Student("小花", 18)
    // 提供获取实例的方法
    def getInstance: Student = ins
  }

  def main(args: Array[String]): Unit = {
    // 外部通过伴生对象的方法获取实例
    val stu1 = Student.getInstance
    val stu2 = Student.getInstance
    // 验证是否为同一个对象
    println(stu1 == stu2)  // 输出true
  }
}
相关推荐
前端 贾公子3 分钟前
第09章:上下文与记忆 (6)
开发语言·前端·python
用户931456355665 分钟前
接口幂等性设计:从原理到落地,一篇讲透
前端
柚yuzumi6 分钟前
别再猜 this:先看它属于谁,再看它指向谁
前端·javascript
YIAN9 分钟前
React + Zustand + JWT 前端权限体系完整实现:从登录鉴权到路由守卫全流程拆解
前端·react.js·架构
汉堡大王952713 分钟前
面试必考:手写代码 new 做了什么?从原理到实现全解析
前端·javascript·面试
大勇前进16 分钟前
折叠面板不用 JS?`<details>` 和 `<summary>` 标签的隐藏用法
后端
Kyrie_kk24 分钟前
Java--TimeUnit时间单位枚举类(时间单位规范)
java·后端
长大198826 分钟前
旧版浏览器不兼容?一行代码引入 html5shiv 拯救你的页面
后端
大勇前进26 分钟前
Canvas 绘图初体验:用代码在网页上“画画”的魔法
后端
大黄评测26 分钟前
图文排版神器:用 `<figure>` 和 `<figcaption>` 规范你的内容结构
后端