Scala中的单例对象和伴生对象

33 阅读1分钟

用 object 关键字来创建一个单例对象。单例对象在整个应用程序中只有一个实例,适合用于存放工具方法、常量或共享状态。

格式: object 对象名{

属性

方法

}

[ 代码说明 ]

1. 通过object关键字创建的是一个对象,不是一个类型。

2. 不能使用new关键字:声明单例对象的时候不可以使用new关键字。

不能传递参数:单例对象无法传递参数 单列对象: 只有一个,不能被new; 适用于存放工具方法,常量。

单列对象:

练习:

object class2 {

  object MyTool {
  // 属性
  val PI=3.14

  //方法
  def Area(r:Double):Double={
    PI*r*r
  }
}

  def main(args: Array[String]): Unit = {

    // 对象名
    // 对象.方法名()

    println( MyTool.PI)
    println(MyTool.Area(10))
  }
}

结果:

屏幕截图 2025-11-03 093041.png

伴生对象

当同名的类和单例对象在同一个源码文件时,这个类称为单例对象的伴生类,对象称为类的伴生对象

object Person {

}

class Person{

}

代码说明:

1. 类名和对象名必须同名。

必须在同一个源码文件中

练习:访问私有方法:

代码:

object class3 {
  /***
   *
   * 伴生类 和伴生对象
   *
   */

  class Student() {
    // private 修饰的属性,无法在类的内部被访问!
    private val hobby="打游戏"

  }

  object Student {
    def introduce(stu:Student):Unit={
      println(s"我的爱好是:${stu.hobby}")
    }
  }

  def main(args: Array[String]): Unit = {
    val stu1=new Student()
    // stu.hobby // 无法访问私有属性

    Student.introduce(stu1)
  }
}

结果:

屏幕截图 2025-11-03 094012.png

练习2

package levelo2

object class8 {
  class Logger(var filename:String){
    def log(message:String):Unit={
      println(s"Log:$message")
  }
}
    object Logger {
      private var instance:Option[Logger]=None
      def apply(filename:String):Logger={
        if(instance.isEmpty){
          instance=Some(new Logger(filename))
        }
        instance.get
      }
    }
  def main(args: Array[String]): Unit = {
    val log1=Logger("test.log")

    log1.log("205-11-03 上午有课")
  }

}

结果:

image.png