伴生类 和 伴生对象

20 阅读1分钟

一。单例对象


package l1

object l03 {
  //object 对象名 {
  // 属性;// 方法;。。。。
  // }
  // 单例对象
  // 只有一个,不能被 new;
  // 适用于存放工具方法,常量。
  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))
  }

}

二.伴生类 和 伴生对象

类和对象同名 在一个文件中 类就是伴生类, 对象就是伴生对象。 特点:可以相互访问对方的私有成员


package l1

object l04 {
  /***
   伴生类 和 伴生对象
   类和对象同名
   在一个文件中
   类就是伴生类, 对象就是伴生对象。
   特点:可以相互访问对方的私有成员
   */
  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()
    //stu1.hobby// 无法访问私有属性
    Student.introduce(stu1)
  }
}

伴生类和伴生对象,实现一种特殊的编程的模式: 单例模式 单例模式:让一个类只能有一个实例对象, 一个类只能被 new 一次! 特点:可以相互访问对方的私有成员


package l1

object l05 {
  /***
   伴生类和伴生对象,实现一种特殊的编程的模式: 单例模式
   单例模式:让一个类只能有一个实例对象, 一个类只能被 new 一次!
   特点:可以相互访问对方的私有成员
   */
  // 1. 把构造函数设置为 private
  class Student private() {

  }
  // 2. 伴生对象中,访问 private
  object Student {
    private val instance=new Student()// 在伴生对象中可以访问 private 修饰的构造器

    def getInstance():Student={
      instance
    }
  }

  def main(args: Array[String]): Unit = {
    // 无法通过 new 来创建对象!
    // val stu1 = new Student ()
    // val stu2 = new Student ()
    // println (stu1 == stu2)
    // false

    val stu1=Student.getInstance()
    val stu2=Student.getInstance()

    println(stu1==stu2)
  }
}

伴生类和伴生对象 在伴生对象中补充一个 apply 方法,这样创建对象的时候,就可以省略 new 伴生类名(参数)==== 伴生对象名.apply (参数)


package l1

object l06 {
  /***
   伴生类和伴生对象
   在伴生对象中补充一个 apply 方法,这样创建对象的时候,就可以省略 new
   伴生类名(参数)==== 伴生对象名.apply (参数)
   */
  // 日志
  class Logger(var filename:String)
  object Logger {
    def apply(filename:String):Logger={
      println("appl...")
      new Logger(filename)

    }
  }

  def main(args: Array[String]): Unit = {
    // 省略 new
    val log1=Logger("test.log")
    println(log1.filename)
  }

}


package l1

object l07 {
  /***
   伴生类和伴生对象 +apply 实现 单例 模式
   在伴生对象中补充一个 apply 方法,这样创建对象的时候,就可以省略 new
   伴生类名(参数)==== 伴生对象名.apply (参数)
   */
  // 日志
  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 = {
    // 省略 new
    val log1=Logger("test.log")
    log1.log("2025-11-03 上午上课")
  }

}


package l1

import java.io.FileWriter

object l08 {
  class Logger(var filename:String) {
    
    def log(message:String): Unit={
      //把日志信息写入到文件中
      val writer=new FileWriter(filename,true)
      writer.write(s"$message \n")
      
      writer.close()
    }
    
  }
  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("2025-11-03 上午上课")
    log1.log("2025-11-05 开运动会")
    log1.log("2025-11-07 周末")
  }
  
}