Scala中的类与对象以及辅助构造器

69 阅读3分钟

在Scala中,用class来创建,用new来创建对象构造器是一个函数,在new的时候,被自动调用,它的作用是实例化对象。 new Class() 就是在调用构造器,或者叫调用构造函数。 辅助构造函数的作用是支持更多的创建对象的方式。 辅助构造器的方法名固定为this,其参数不能使用var或val修饰,且必须在第一行代码中直接或间接调用主构造器。

类和构造函数

代码

// 类是属性的集合
// Student,构造函数用来创造对象的
//                 辅助构造函数,提供多种创建对象的方式
class Student(var name:String, var age:Int) {
    println("构造函数被调用...")

    def sayHi():Unit = {
      println(s"我是${name}, 我今年${age}岁")
    }

    // 辅助构造函数
    // (1)它的名字就是this
    // (2)它内部的第一句代码就必须是调用 主构造函数 this("无名氏", 0)
    def this() = {
      this("无名氏", 0)
      println("辅助构造函数1被调用...")
    }

    def this(name:String) = {
      this(name, 19)
      println("辅助构造函数2被调用...")
    }
  }

  object base2401 {
    def main(args: Array[String]): Unit = {
      // 创建一个学生对象
      // val stu1 = new Student("小花", 18)
      // 调用对象的方法
      // stu1.sayHi()

      // stu1.age = 19
      // 调用对象的方法
      // stu1.sayHi()

      // 这里没有设置参数,它会调用辅助构造函数
      //      val stu2 = new Student()
      //      stu2.sayHi()

      // 这里设置了一个参数,它会调用辅助构造函数
      val stu3 = new Student("小明")
      stu3.sayHi()
    }
}

运行结果

屏幕截图 2025-10-29 213101.png

主要特点:

  • 定义了 Student 类,包含主构造函数和辅助构造函数
  • 主构造函数:class Student(var name:String, var age:Int)
  • 两个辅助构造函数:
    • this() - 无参构造函数,设置默认值
    • this(name:String) - 单参构造函数,年龄默认为19

关键语法:

  • 辅助构造函数必须首先调用主构造函数
  • 使用 this 关键字定义辅助构造函数

访问控制

代码

object base2103 {
  // 私有 private
  class Student(var name: String, var age: Int) {

    // 在方法面前添加 private,那这个方法是私有的,它不能在 class的 外部被访问
    private def song(): Unit = {
      println("我在唱歌....")
    }

    def sayHi(): Unit = {
      println(s"我是${name}, 我今年${age}岁")

      // 私有方法,在类的内部是可以正常调用的
      song()
    }
  }

  def main(args: Array[String]): Unit = {
    val stu3 = new Student("小明", 18)
    stu3.sayHi()
    // stu3.song() // 会报错
  }
}

运行结果

屏幕截图 2025-10-29 213114.png

主要特点:

  • 演示了 private 关键字的使用
  • 私有方法只能在类的内部访问
  • 公有方法可以访问私有方法

重要概念:

private def song(): Unit = { ... }  // 私有方法,只能在类内部调用
def sayHi(): Unit = { ... }         // 公有方法,可以在外部调用

单例对象

代码

// object 对象

// 单例对象,直接使用object来定义。不能用new!
// 单例对象,只有一个,不能通过new来生成多个。它一般用来存放工具方法,常量或共享状态。
object Tools {
  val PI = 3.14

  def doubleN(n: Int): Int = {
    n * 2
  }
}

object base2403 {
  def main(args: Array[String]): Unit = {
    val rst = Tools.PI * Tools.doubleN(2) // 12.56

    println(s"rst = ${rst}")

  }
}

运行结果

屏幕截图 2025-10-29 213139.png

主要特点:

  • 使用 object 关键字定义单例对象
  • 单例对象不能使用 new 实例化
  • 常用于工具方法、常量和共享状态

用途:

  • 存放工具方法和常量
  • 作为应用程序的入口点
  • 实现静态方法和字段的功能