类与对象 #
一、类定义 #
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