scala 样例类
文章目录
- 前言
- 1.主构造函数示例
- 2.带辅助构造函数的样例类举例
- 3.带默认参数的主构造函数 vs 辅助构造函数 举例
- 其他举例
前言
提示:主要对基础的scala样例类使用做一些说明:
1.主构造函数示例
// 主构造函数样例类
case class Person(name: String, age: Int) {println(s"主构造函数创建:$name, $age岁")
}object Main1 {def main(args: Array[String]): Unit = {val p = Person("Alice", 25) // 自动调用主构造函数println(s"输出:${p.name}的年龄是${p.age}")}
}
输出:
主构造函数创建:Alice, 25岁
输出:Alice的年龄是25
2.带辅助构造函数的样例类举例
// 主构造函数+辅助构造函数
case class Book(title: String, author: String, price: Double) {// 辅助构造函数1(通过this定义)def this(title: String) = {this(title, "未知作者", 0.0)println(s"辅助构造函数1创建:仅标题《$title》")}// 辅助构造函数2def this(title: String, author: String) = {this(title, author, 50.0) // 必须优先调用主构造函数println(s"辅助构造函数2创建:《$title》- $author")}
}object Main2 {def main(args: Array[String]): Unit = {val b1 = Book("Scala编程") // 调用辅助构造函数1val b2 = Book("Java核心", "James") // 调用辅助构造函数2val b3 = Book("Python入门", "Guido", 39.9) // 调用主构造函数println(s"对比输出:\n" +s"b1: ${b1.title}|${b1.author}|${b1.price}\n" +s"b2: ${b2.title}|${b2.author}|${b2.price}\n" +s"b3: ${b3.title}|${b3.author}|${b3.price}")}
}
输出:
辅助构造函数1创建:仅标题《Scala编程》
辅助构造函数2创建:《Java核心》- James
对比输出:
b1: Scala编程|未知作者|0.0
b2: Java核心|James|50.0
b3: Python入门|Guido|39.9
3.带默认参数的主构造函数 vs 辅助构造函数 举例
代码如下(示例):
// 默认参数主构造函数
case class Student(name: String, grade: Int = 1, school: String = "第一中学") {println(s"主构造函数:$name 在 $school 读 $grade 年级")
}// 辅助构造函数版本
case class Teacher(name: String, subject: String, years: Int) {def this(name: String) = {this(name, "未分配科目", 0) //注意这里调用主构造函数 println(s"辅助构造函数:新教师$name")}
}object Main3 {def main(args: Array[String]): Unit = {val s1 = Student("小明") // 使用默认参数val s2 = Student("小红", 3, "实验中学") // 覆盖所有参数val t1 = new Teacher("张老师") // 调用辅助构造函数val t2 = Teacher("李老师", "数学", 10) // 调用主构造函数println(s"学生对比:${s1.grade} vs ${s2.grade}")println(s"教师对比:${t1.subject} vs ${t2.subject}")}
}
输出:
主构造函数:小明 在第一中学读1年级
主构造函数:小红 在实验中学读3年级
辅助构造函数:新教师张老师
学生对比:1 vs 3
教师对比:未分配科目 vs 数学
*辅助构造函数必须首行调用主构造函数或其他辅助构造函数(如 this(…)),这是 Scala 的强制语法规则.
强制调用顺序:
辅助构造函数的第一行代码必须调用主构造函数或其他已定义的辅助构造函数。若违反此规则,编译器会直接报错。
原因:Scala通过这种方式确保所有构造路径最终都会调用主构造函数,从而统一对象的初始化逻辑。
间接调用主构造函数:
即使辅助构造函数首次调用的是其他辅助构造函数,最终也必须通过链式调用传递到主构造函数。例如:
class Person(name: String) { // 主构造函数def this() = this("Anonymous") // 辅助构造函数1 → 调用主构造函数def this(name: String, age: Int) = { // 辅助构造函数2 → 调用辅助构造函数1this() // 间接调用主构造函数println(s"Name: $name, Age: $age")}
}
其他举例
代码示例:
case class Person(name: String, age: Int) {// 辅助构造函数1:仅接受name参数,age默认为0def this(name: String) = this(name, 0)// 辅助构造函数2:接受出生年份,动态计算年龄def this(birthYear: Int) = this("Unknown", 2025 - birthYear)
}
// 使用示例
val person1 = Person("Alice", 25) // 主构造器 -重点
val person2 = new Person("Bob") // 辅助构造器1(需用new) -重点
val person3 = new Person(1990) // 辅助构造器2(需用new) -重点
举例另一种例子
case class Person(name: String, age: Int) {// 辅助构造函数:通过另一个Person对象初始化def this(other: Person) = this(other.name, other.age + 1) // 年龄+1作为差异
}// 使用示例
val person1 = Person("Alice", 25) // 主构造器
val person2 = new Person(person1) // 辅助构造器(需用new) -重点
println(person2) // 输出: Person(Alice,26)