ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
样例类可以让 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 修饰符以及类和对象会变得稍微大一些。变大的原因是产生了附加的方法以及对每个构造器参数添加了隐含的前缀,不过样例类最大的好处还是支持模式匹配。