伴生类和单例对象

创建对象的方式:

    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
  }
}
相关推荐
ZWZhangYu1 小时前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
考虑考虑2 小时前
瀚高数据库
数据库·后端·postgresql
锋行天下3 小时前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
jktantan3 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
计算机魔术师3 小时前
Anthropic官方插件被「寄生」,背后是同一类攻击又来了
前端
我命由我123454 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
key_3_feng4 小时前
评估与对齐:Agent 自我进化的护栏
前端·数据库·agent
小小张说故事4 小时前
Python 的 str 为什么设计成不可变?拆开字符串驻留、字符串池,以及 += 拼接到底慢在哪
后端·python
LaughingZhu5 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion
AI架构师之家5 小时前
我把 Hermes 这匹"马"养了两周,它干了一件让我有点发毛的事
后端