在 Scala 中,class
是面向对象编程的基础,用于定义对象的属性和行为。以下是 Scala 中 class
的使用方法和特性:
1. 基本类定义
最简单的类定义形式如下:
scala
class Person {
// 类的字段
var name: String = ""
var age: Int = 0
// 类的方法
def sayHello(): Unit = {
println(s"Hello, my name is $name, I'm $age years old.")
}
}
创建类的实例:
scala
val person = new Person()
person.name = "Alice"
person.age = 30
person.sayHello() // 输出: Hello, my name is Alice, I'm 30 years old.
2. 带参数的类
Scala 类可以直接在类名后定义参数,这些参数会成为类的字段:
scala
class Person(name: String, age: Int) {
// 可以使用构造参数定义方法
def introduce(): Unit = {
println(s"I'm $name, $age years old.")
}
}
// 创建实例时必须传入参数
val person = new Person("Bob", 25)
person.introduce() // 输出: I'm Bob, 25 years old.
3. 访问修饰符
Scala 提供了几种访问修饰符:
- 默认(无修饰符):同包可见
private
:仅类内部可见protected
:类内部和子类可见private[this]
:仅当前实例可见
scala
class Person(private val name: String, var age: Int) {
// name 是 private,只能在类内部访问
def getName: String = name
}
val p = new Person("Charlie", 35)
println(p.age) // 允许访问(var 修饰)
// println(p.name) // 编译错误(private)
println(p.getName) // 允许访问(通过方法暴露)
4. 辅助构造函数
除了主构造函数(类名后的参数),还可以定义辅助构造函数:
scala
class Person(var name: String, var age: Int) {
// 辅助构造函数,必须调用主构造函数或其他辅助构造函数
def this(name: String) = this(name, 0)
def this() = this("Unknown")
}
// 使用不同的构造函数创建实例
val p1 = new Person("David", 40)
val p2 = new Person("Eve") // 年龄默认为 0
val p3 = new Person() // 姓名默认为 Unknown,年龄默认为 0
5. 继承
使用 extends
关键字实现类的继承:
scala
class Student(name: String, age: Int, val major: String) extends Person(name, age) {
def study(): Unit = {
println(s"Student $name is studying $major.")
}
}
val student = new Student("Frank", 20, "Computer Science")
student.introduce() // 继承自 Person 的方法
student.study() // 子类自己的方法
6. 抽象类
使用 abstract
关键字定义抽象类,抽象类可以包含抽象方法(无实现):
scala
abstract class Animal {
def sound(): Unit // 抽象方法,无实现
}
class Dog extends Animal {
override def sound(): Unit = {
println("Woof!")
}
}
class Cat extends Animal {
override def sound(): Unit = {
println("Meow!")
}
}
总结
Scala 的类系统融合了面向对象和函数式编程的特性,相比 Java 更加简洁灵活。类的参数默认就是字段,不需要显式定义,这减少了样板代码。