伴生类和单例对象

创建对象的方式:

    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
  }
}
相关推荐
阿赛工作室16 小时前
AI时代WEB开发人员生存与发展报告
前端·人工智能·node.js
程序员清风16 小时前
科普一下:大模型Token的收费逻辑!
java·后端·面试
Nyarlathotep011317 小时前
并发集合类(4):ArrayBlockingQueue
java·后端
ZC跨境爬虫17 小时前
跟着 MDN 学 HTML day_36:(深入理解 Comment 接口与 DOM 注释节点)
前端·javascript·ui·html·音视频·视频编解码
石小石Orz17 小时前
Harness Engineering 到底是什么?概念、实战与争议,一次全部讲清楚
前端·后端
悠哉摸鱼大王17 小时前
cesium学习(三)-3d tiles
前端·cesium
前端那点事17 小时前
Vue3自定义Hooks保姆级教程!从原理到企业级实战,告别混乱代码
前端·vue.js
前端那点事17 小时前
别再乱用Vue3响应式!ref、reactive、toRef、toRefs完整区别+企业级落地实战
前端·vue.js
yingyima17 小时前
Base64 编码解码实战:业务场景下的高效应用
前端
悠哉摸鱼大王17 小时前
cesium学习(五)-Primitive
前端·cesium