1. Scala 中的类;
在 Scala 中,类(Class)是面向对象编程的基本构建块,用于封装数据(属性)和行为(方法)。Scala 的类设计融合了面向对象和函数式编程的特性,相比 Java 更加简洁灵活。
一、基本定义与使用
Scala 类的定义通过 class 关键字声明,可包含字段(属性)和方法
def introduce(): Unit = {
println(s"我叫$name,今年$age岁")
}
}
// 使用类(创建实例)
object Main {
def main(args: Array[String]): Unit = {
val p = new Person() // 必须用new关键字创建实例
p.name = "张三" // 修改可变字段
p.introduce() // 调用方法,输出:我叫张三,今年0岁
二、构造器(Constructor)
Scala 类有两种构造器:主构造器和辅助构造器,主构造器是类定义的一部分。
1. 主构造器
// 主构造器参数:name和age
class Person(val name: String, var age: Int) {
// 主构造器执行体(创建实例时会执行)
println(s"创建了Person实例:$name, $age")
def introduce(): Unit = {
println(s"我叫$name,今年$age岁")
}
}
// 使用主构造器创建实例
val p = new Person("李四", 20) // 输出:创建了Person实例:李四, 20
p.introduce() // 输出:我叫李四,今年20岁
直接在类名后定义参数,这些参数会成为类的字段
- 主构造器参数前加
val:不可变字段(对外可见,可读取) - 主构造器参数前加
var:可变字段(对外可见,可读写) - 不加修饰符:参数仅在类内部可见
2. 辅助构造器
通过 this 定义,必须调用主构造器或其他辅助构造器
class Person(val name: String, var age: Int) {
// 辅助构造器1(无参数)
def this() = this("未知", 0)
// 辅助构造器2(仅name参数)
def this(name: String) = this(name, 0)
def introduce(): Unit = {
println(s"我叫$name,今年$age岁")
}
}
// 使用辅助构造器
val p1 = new Person() // 调用this()
val p2 = new Person("王五") // 调用this("王五")
三、访问控制修饰符
Scala 提供访问控制修饰符,控制字段 / 方法的可见性
- 默认(无修饰符) :同包及子类可见
- private:仅当前类可见
- protected:当前类及子类可见
- private[this] :仅当前实例可见(比 private 更严格)
class Person {
private val id: String = "1001" // 仅当前类可见
protected var score: Int = 90 // 类及子类可见
var name: String = "赵六" // 同包及子类可见
}
class Student extends Person {
def getScore(): Int = score // 可访问protected字段
// def getId(): String = id // 错误:private字段不可访问
}
四、伴生类与伴生对象
Scala 没有静态成员,而是通过伴生对象(Companion Object) 实现类似功能:
- 伴生类与伴生对象同名,定义在同一文件中
- 伴生对象可访问伴生类的私有成员,反之亦然
// 伴生类
class Person(val name: String) {
private val id = "P001"
}
// 伴生对象(用object定义)
object Person {
// 工厂方法,创建实例
def apply(name: String): Person = new Person(name)
// 访问伴生类的私有成员
def getPersonId(p: Person): String = p.id
}
// 使用
val p = Person("孙七") // 调用伴生对象的apply方法,省略new
println(Person.getPersonId(p)) // 输出:P001
五、继承与抽象类
Scala 支持类的继承,使用 extends 关键字,且父类构造器必须被调用。
1. 普通类继承
2. 抽象类:
用 abstract 修饰,可包含抽象方法(无实现),不能直接实例化:#### 2. 抽象类
用 abstract 修饰,可包含抽象方法(无实现),不能直接实例化:
class Animal(val name: String) {
def eat(): Unit = println(s"$name在吃东西")
}
// 子类(继承Animal)
class Dog(name: String) extends Animal(name) {
// 重写父类方法(必须加override)
override def eat(): Unit = println(s"$name在啃骨头")
def bark(): Unit = println(s"$name在汪汪叫")
}
val dog = new Dog("旺财")
dog.eat() // 输出:旺财在啃骨头
dog.bark() // 输出:旺财在汪汪叫
六、特殊类:case 类
Scala 提供 case class(样例类),常用于存储数据(如 DTO、模型),自动生成以下内容:
- 主构造器参数自动转为
val字段 equals、hashCode、toString方法- 伴生对象及
apply方法(无需 new 创建实例)
case class User(id: Int, name: String)
// 使用
val u1 = User(1, "周八") // 无需new
val u2 = User(1, "周八")
println(u1 == u2) // 输出:true(自动实现equals)
println(u1) // 输出:User(1,周八)(自动实现toString)
总结
Scala 类的特性体现了其简洁性和灵活性
2. Scala中的对象;
(一)[面向对象的相关概念]
1.什么是面向对象:
它是一种编程思想,它是基于面向对象的,强调的是以对象为基础完成各种操作。
2.面向对象的三大思想特点是什么:
(1) 更符合人们的思考习惯
(2) 把复杂的事情简单化
(3) 把程序员从执行者变成指挥者
3. 面向对象的三大特征是
(1) 封装
(2) 继承
(3) 多态
4. 什么是类class? 类是属性和行为的集合。
(1) 属性也叫成员变量:名词,用来描述事物的外在特征
(2) 行为也叫成员方法:动词,表示事物能做什么