类与对象 #

一、类定义 #

1.1 基本语法 #

scala
class Person:
  var name: String = ""
  var age: Int = 0
  
  def greet(): String = s"Hello, I'm $name"

val person = new Person
person.name = "Alice"
person.age = 25
println(person.greet())

1.2 带参数的类 #

scala
class Person(name: String, age: Int):
  def greet(): String = s"Hello, I'm $name, $age years old"

val person = Person("Alice", 25)
println(person.greet())

1.3 Scala 3 新语法 #

Scala 3 可以省略 new 关键字:

scala
val person = Person("Alice", 25)

二、属性 #

2.1 val 属性 #

scala
class Person(val name: String, val age: Int)

val person = Person("Alice", 25)
println(person.name)
println(person.age)

2.2 var 属性 #

scala
class Person(var name: String, var age: Int)

val person = Person("Alice", 25)
person.name = "Bob"
person.age = 30

2.3 私有属性 #

scala
class Person(name: String, age: Int):
  def getName: String = name
  def getAge: Int = age

val person = Person("Alice", 25)

2.4 私有字段 #

scala
class Person(name: String, age: Int):
  private var _name = name
  private var _age = age
  
  def name_=(newName: String): Unit = _name = newName
  def name: String = _name
  
  def age_=(newAge: Int): Unit = _age = newAge
  def age: Int = _age

val person = Person("Alice", 25)
person.name = "Bob"
println(person.name)

三、方法 #

3.1 定义方法 #

scala
class Calculator:
  def add(a: Int, b: Int): Int = a + b
  def subtract(a: Int, b: Int): Int = a - b
  def multiply(a: Int, b: Int): Int = a * b
  def divide(a: Int, b: Int): Option[Int] =
    if b != 0 then Some(a / b) else None

val calc = Calculator()
println(calc.add(10, 5))

3.2 无参方法 #

scala
class Counter:
  private var count = 0
  
  def increment(): Unit = count += 1
  def current: Int = count

val counter = Counter()
counter.increment()
println(counter.current)

3.3 方法重载 #

scala
class Math:
  def add(a: Int, b: Int): Int = a + b
  def add(a: Double, b: Double): Double = a + b
  def add(a: Int, b: Int, c: Int): Int = a + b + c

val math = Math()
math.add(1, 2)
math.add(1.5, 2.5)
math.add(1, 2, 3)

四、访问控制 #

4.1 访问修饰符 #

修饰符 访问范围
private 同一类内
protected 同一类及子类
无修饰符 公开访问

4.2 private #

scala
class BankAccount(initialBalance: Double):
  private var balance = initialBalance
  
  def deposit(amount: Double): Unit =
    if amount > 0 then balance += amount
  
  def withdraw(amount: Double): Unit =
    if amount > 0 && amount <= balance then balance -= amount
  
  def getBalance: Double = balance

val account = BankAccount(1000.0)
account.deposit(500.0)
account.withdraw(200.0)
println(account.getBalance)

4.3 protected #

scala
class Animal:
  protected def makeSound(): String = "Some sound"

class Dog extends Animal:
  def bark(): String = makeSound()

val dog = Dog()
println(dog.bark())

4.4 包私有 #

scala
package com.example

class MyClass:
  private[example] def internalMethod(): String = "internal"
  private[this] def instancePrivate(): String = "instance private"

五、对象(Object) #

5.1 单例对象 #

scala
object Counter:
  private var count = 0
  
  def increment(): Int =
    count += 1
    count
  
  def current: Int = count

Counter.increment()
Counter.increment()
println(Counter.current)

5.2 工具对象 #

scala
object MathUtils:
  def square(x: Double): Double = x * x
  def cube(x: Double): Double = x * x * x
  def factorial(n: Int): Int =
    if n <= 1 then 1 else n * factorial(n - 1)

println(MathUtils.square(5))
println(MathUtils.factorial(5))

5.3 枚举对象 #

scala
object Direction:
  val North = "N"
  val South = "S"
  val East = "E"
  val West = "W"

println(Direction.North)

六、伴生对象 #

6.1 定义伴生对象 #

与类同名且定义在同一文件中的对象:

scala
class Person(val name: String, val age: Int)

object Person:
  def apply(name: String): Person = Person(name, 0)
  def create(name: String, age: Int): Person = Person(name, age)

val p1 = Person("Alice")
val p2 = Person.create("Bob", 25)

6.2 apply 方法 #

scala
class Person(val name: String, val age: Int)

object Person:
  def apply(name: String, age: Int): Person = new Person(name, age)

val person = Person("Alice", 25)

6.3 unapply 方法 #

用于模式匹配提取:

scala
class Person(val name: String, val age: Int)

object Person:
  def apply(name: String, age: Int): Person = new Person(name, age)
  def unapply(person: Person): Option[(String, Int)] =
    Some((person.name, person.age))

val person = Person("Alice", 25)

person match
  case Person(name, age) => println(s"$name is $age years old")

6.4 共享私有成员 #

scala
class Account private (val id: String, var balance: Double)

object Account:
  private var nextId = 0
  
  def apply(initialBalance: Double): Account =
    nextId += 1
    new Account(s"ACC-$nextId", initialBalance)

val account = Account(1000.0)
println(account.id)

七、辅助构造函数 #

7.1 定义辅助构造函数 #

scala
class Person(val name: String, val age: Int):
  def this(name: String) = this(name, 0)
  def this() = this("Unknown")

val p1 = Person("Alice", 25)
val p2 = Person("Bob")
val p3 = Person()

7.2 构造函数规则 #

  • 第一个语句必须调用其他构造函数
  • 最终必须调用主构造函数
scala
class Rectangle(val width: Double, val height: Double):
  def this(size: Double) = this(size, size)
  def this() = this(1.0)
  
  def area: Double = width * height

val r1 = Rectangle(10, 20)
val r2 = Rectangle(5)
val r3 = Rectangle()

八、类参数 #

8.1 默认参数值 #

scala
class Person(
  val name: String = "Unknown",
  val age: Int = 0
)

val p1 = Person()
val p2 = Person("Alice")
val p3 = Person("Bob", 25)
val p4 = Person(age = 30)

8.2 命名参数 #

scala
class Config(
  val host: String = "localhost",
  val port: Int = 8080,
  val timeout: Int = 5000
)

val config = Config(port = 9090, host = "example.com")

九、类最佳实践 #

9.1 使用不可变类 #

scala
class Person(val name: String, val age: Int):
  def withName(newName: String): Person = Person(newName, age)
  def withAge(newAge: Int): Person = Person(name, newAge)

val p1 = Person("Alice", 25)
val p2 = p1.withAge(26)

9.2 使用 case class #

对于简单的数据类,使用 case class:

scala
case class Person(name: String, age: Int)

val p1 = Person("Alice", 25)
val p2 = p1.copy(age = 26)

9.3 封装可变状态 #

scala
class Counter:
  private var count = 0
  
  def increment(): Int =
    count += 1
    count
  
  def current: Int = count
  
  def reset(): Unit =
    count = 0

十、总结 #

类定义要素 #

要素 说明
class 定义类
val/var 定义属性
def 定义方法
private 私有访问
protected 受保护访问

对象类型 #

类型 说明
object 单例对象
伴生对象 与类同名的对象
case object 单例样例对象

下一步,让我们学习 构造函数

最后更新:2026-03-27