在面向对象编程(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 方法 |