Scala 面向对象编程:类、构造函数与单例对象

48 阅读4分钟

在面向对象编程(OOP)中,类和对象是核心概念。Scala 作为一门融合了面向对象与函数式编程思想的语言,其类与对象的设计既保留了 OOP 的经典特性,又加入了独特的语法简化。本文将通过实例代码,详细讲解 Scala 中类的定义、构造函数的使用以及单例对象的特性,帮助初学者快速掌握 Scala 面向对象编程的基础。

一、Scala 类的基础:属性、方法与构造函数

类是属性(数据)和方法(行为)的集合,是创建对象的 “模板”。在 Scala 中,类的定义简洁灵活,同时支持主构造函数和辅助构造函数,满足不同场景下的对象创建需求。

1.1 类的定义与主构造函数

Scala 中,类的主构造函数非常特殊 —— 它直接定义在类名后面的括号中,括号内的参数会自动成为类的成员属性(若用 var 修饰则为可变属性,val 修饰则为不可变属性)。


// 类是属性和方法的集合

class Student(var name: String, var age: Int) {
  println("主构造函数被调用...")

  // 成员方法需定义在类内部
  def sayHi(): Unit = {
    println(s"我是${name}, 我今年${age}")
  }

  // 辅助构造函数(必须定义在类内部)
  // 辅助构造函数的名字是this,且第一句必须调用主构造函数或其他辅助构造函数
  def this() = {
    this("无名氏", 0)  // 调用主构造函数
    println("辅助构造函数1被调用...")
  }

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

object base61 {
  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()
  }
}

二、私有成员:控制访问权限

在面向对象编程中,“封装” 是核心特性之一 —— 通过控制成员的访问权限,隐藏类的内部实现细节,只暴露必要的接口。Scala 中用 private 关键字修饰成员,使其只能在类内部访问,类外部无法直接调用。

2.1 私有方法的定义与使用

我们以 Student 类为例,定义一个私有方法 song(),用于模拟 “学生唱歌” 的行为,且该行为只能在类内部触发

object base62 {
// 私有 privata

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

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

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

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


    val stu3 = new Student("小明",18)
    stu3.sayHi()
  }
}

三、单例对象(Object):全局唯一的实例

在 Scala 中,object 关键字用于定义单例对象—— 即该对象在程序运行期间只有一个实例,无法通过 new 关键字创建多个实例。单例对象通常用于存放 “全局工具方法”“常量” 或 “程序入口”,避免重复创建对象造成资源浪费。

3.1 单例对象的定义

我们定义一个 Tools 单例对象,用于存放数学常量(如圆周率 PI)和工具方法

//object 对象
//单例对象 直接使用object来定义 不能用new
//单例对象 只有一个 不能通过new来生成多个 它一般用来存放工具方法,常量...
object Tools {
  val PI = 3.14
  def doubleN(n:Int):Int = {
    n * 2
  }
}
object base63 {
  def main(args: Array[String]): Unit = {


    val rst = Tools.PI * Tools.doubleN(2)
    println(s"rst = ${rst}")
  }
}

四、总结:Scala 面向对象核心要点

通过本文的三个示例,我们梳理出 Scala 面向对象编程的核心知识点:

概念关键特性
类(Class)属性与方法的集合,主构造函数定义在类名后,辅助构造函数需用 this 且调用主构造函数
私有成员(Private)仅在类内部访问,实现封装,隐藏内部逻辑
单例对象(Object)全局唯一实例,无需 new,用于存放工具方法、常量或 main 方法