scala中的类和对象

167 阅读4分钟

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 字段
  • equalshashCodetoString 方法
  • 伴生对象及 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) 行为也叫成员方法:动词,表示事物能做什么