伴生类和单例对象

创建对象的方式:

    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
  }
}
相关推荐
Lear3 小时前
SpringBoot 如何删除清理垃圾文件?
后端
BingoGo3 小时前
Laravel 新项目避坑指南10 大基础设置让代码半年不崩
后端·php
trsoliu3 小时前
React 19正式发布:引入React Compiler与全新并发特性
前端·react.js
JMzz3 小时前
Rust 中的数据结构选择与性能影响:从算法复杂度到硬件特性 [特殊字符]
开发语言·数据结构·后端·算法·性能优化·rust
鹿邑网爬3 小时前
Python 制作“满屏浪漫弹窗”教程
后端·python
风一样的美狼子3 小时前
仓颉语言核心数据结构-高性能与类型安全的工程实践
java·服务器·前端
gustt3 小时前
让你的 AI 更听话:Prompt 工程的实战秘籍
人工智能·后端·node.js
旺仔小拳头..3 小时前
HTML的布局—— DIV 与 SPAN
前端·html
T___T3 小时前
从原生 CSS 到 Stylus:用弹性布局实现交互式图片面板
前端·css