scala中class的使用

在 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 更加简洁灵活。类的参数默认就是字段,不需要显式定义,这减少了样板代码。

相关推荐
ClouGence17 分钟前
SAP HANA 到 Doris 数据迁移:4 种方案对比与迁移教程
数据库·后端·dba
LVZ20 分钟前
用了半年 AI 写代码,最烦的不是代码,是环境
前端·后端·开源
云边有个稻草人27 分钟前
从一条危险的 WHERE 条件说起:金仓数据库逻辑安全警示
后端
用户77139702070627 分钟前
从一脸懵到熟练使用:我的C#CAD二次开发日常中那些“反人类“的循环技巧
后端
JaneConan1 小时前
鸿蒙报错速查:arkts-no-any any 类型禁用,用了就炸,根因 + 真解法
后端·harmonyos
颜酱1 小时前
# 02 | 搭骨架:用 LangGraph 编排 12 步工作流(思路)
前端·人工智能·后端
颜酱1 小时前
02 | 搭骨架:用 LangGraph 编排 12 步工作流
前端·人工智能·后端
嘉伟桑3 小时前
Python调用电价API返回JSON示例:分时电价、现货电价和字段解析
后端
武子康3 小时前
Shippy:确定性工具、会话级 Sandbox 与 Live-Data Eval(4 类收敛 + 7 步实现方案 + 6 类评测指标)
前端·人工智能·后端
我叫黑大帅3 小时前
我为什么单一消费者的场景下,要用 Redis List 当消息队列?
redis·后端·面试