样例类可以让 Scala 编译器自动为类添加一些便捷设定,可以使用样例类来替换伴生,减少代码量。
```scala
case class Student(name:String, age:Int) //定义样例类
val stu=Student("Jason",19) // 创建样例类的实例,无需 new 关键字
println(stu.name) //访问对象属性
```
* 样例类构造参数默认声明为`val`,自动实现类构造参数的getter方法;
* 样例类构造参数声明为`var`时,自动实现类构造参数的setter和getter方法;
* 样例类自动创建伴生对象;
* 样例类自动实现的其他方法 toString()、equals()、copy()、hashCode()、apply()、unapply();
<br/>
**1. 定义&调用样例类**
```scala
// 样例类
case class Student(var name:String, var age:Int)
object App {
def main(args: Array[String]): Unit = {
// 因为样例类自动创建伴生对象,所以可以不用new
val stu = Student("Tom", 20)
println(stu.name) // Tom
Student.name // 编译报错
}
}
```
<br/>
**2. `case class`与`class`的区别:**
* 样例类通常用于描述不可变的数据,数据完全依赖构造参数。如果一个对象在内部执行有状态计算,或者表现出其他类型的复杂行为,那么它应该是一个普通类。
* 样例类默认可用伴生对象方式创建实例,普通类需要定义 apply()。
* 样例类默认不可变,通过模式匹配可分解
* 两个样例类`==`操作时,通过按值比较而不是按引用
* 样例类默认支持模式匹配,普通类需要定义 unapply(),该方法将在后面的模式匹配中用到。
总的来说,样例类本质还是方便我们创建、操作的普通类而已,可以说编译器以极小的转换为我们带来了极大的便利,代价便是使用 case 修饰符以及类和对象会变得稍微大一些。变大的原因是产生了附加的方法以及对每个构造器参数添加了隐含的前缀,不过样例类最大的好处还是支持模式匹配。
- Scala是什么?
- Scala特性
- 开发环境搭建
- 环境搭建
- windows下的环境搭建
- IntelliJ IDEA环境搭建
- Scala关键字
- Hello, World
- 数据类型
- 数据类型
- 数据类型层次结构
- 字面量
- Null类型
- Nothing类型
- Unit类型
- 变量与常量
- type定义类型别名
- 字符串插值器
- 条件控制
- 循环控制
- 数组
- 元组
- 集合
- 集合分类
- List常用操作
- Set常用操作
- Map常用操作
- 函数
- 函数声明与调用
- 函数与方法的区别
- 函数注意事项
- 匿名函数
- 可变参数
- 高阶函数
- 中置表达式
- 函数嵌套
- 函数科里化
- 隐式参数
- 隐式函数
- 闭包
- 类和对象
- Java与Scala的比较
- 有关类与对象概念
- 类
- 类的定义和调用
- 类的继承
- 抽象类
- 单例对象
- 伴生对象和伴生类
- 特质
- 定义特质
- 混入特质
- 抽象类与特质的选择
- 自身类型
- 依赖注入
- this别名
- 样例类
- 枚举类
- 泛型类
- 包与包对象
- 模式匹配
- 基本语法
- 匹配模式
- 偏函数
- 注解
- 运算符
- 正则表达式
- 隐式类
- 异常处理
- 高级类型
- 结构类型
- 复合类型