文章目录
样例类
样例类是一种特殊类,它可以用来快速定义一个用于保存数据的类(类似于Java POJO类)
定义
语法格式
case class 样例类名([var/val] 成员变量名1:类型1, 成员变量名2:类型2, 成员变量名3:类型3)
- 如果要实现某个成员变量可以被修改,可以添加var
- 默认为val,可以省略
代码示例
object Test01 {
//定义一个Person类,包含姓名和年龄成员变量
case class Person(var name:String,var age:Int)
def main(args: Array[String]): Unit = {
//创建样例类的的对象实例 样例类的实例创建不需要加new关键字
val z = Person("张三",20)
//修改年龄
z.age = 23
//输出
println(s"z = ${z}")
}
}
样例类的方法
当我们定义一个样例类,编译器自动帮助我们实现了以下几个有用的方法:
- apply方法
- toString方法
- equals方法
- hashCode方法
- copy方法
apply方法 和 toString 方法
- apply方法可以让我们快速地使用类名来创建对象。
- toString返回样例类名称(成员变量1, 成员变量2, 成员变量3…),我们可以更方面查看样例类的成员
代码示例
object Test02 {
//定义一个CasePerson类,包含姓名和年龄成员变量
case class CasePerson(var name:String,var age:Int)
def main(args: Array[String]): Unit = {
//使用apply方法 不需要使用 new 关键字直接创建对象
val apply = CasePerson("李四",18)
//使用toString输出对象
println(s"apply = ${apply.toString}") //apply = CasePerson(李四,18)
}
}
equals方法
样例类自动实现了equals方法,可以直接使用==比较两个样例类是否相等,即所有的成员变量是否相等
代码示例
object Test03 {
//定义一个CasePerson类,包含姓名和年龄成员变量
case class CasePerson(var name:String,var age:Int)
def main(args: Array[String]): Unit = {
//创建两个样例对象对象
val a = CasePerson("李四", 21)
val b = CasePerson("李四", 21)
//使用 == 判断
println(a == b) //true
//使用 equals 判断
println(a.equals(b)) //true
}
}
hashCode方法
样例类自动实现了hashCode方法,如果所有成员变量的值相同,则hash值相同,只要有一个不一样,则hash值不一样。
代码示例
object Test04 {
//定义一个CasePerson类,包含姓名和年龄成员变量
case class CasePerson(var name:String,var age:Int)
def main(args: Array[String]): Unit = {
//创建两个样例对象对象
val a = CasePerson("李四", 21)
val b = CasePerson("李四", 21)
val c = CasePerson("李四", 20)
//输出 a 的 哈希值
println(s"a.hashCode() = ${a.hashCode()}") //718456491
//输出 b 的 哈希值
println(s"b.hashCode() = ${b.hashCode()}") //718456491
//输出 c 的 哈希值
println(s"c.hashCode() = ${c.hashCode()}") //-1780906662
}
}
copy方法
样例类实现了copy方法,可以快速创建一个相同的实例对象,可以使用带名参数指定给成员进行重新赋值
object Test05 {
//定义一个CasePerson类,包含姓名和年龄成员变量
case class CasePerson(var name:String,var age:Int)
def main(args: Array[String]): Unit = {
//创建一个实例对象
val a = CasePerson("李四", 21)
//使用copy创建对象
val b = a.copy(name="王五")
//输出
println(b) //CasePerson(王五,21)
}
}
样例对象
它主要用在两个地方:
- 定义枚举
- 作为没有任何参数的消息传递
定义
使用case object可以创建样例对象。样例对象是单例的,而且它没有主构造器
语法格式
case object 样例对象名
代码示例
//定义枚举
object Test06 {
//定义一个性别特质
trait Sex
//定义一个样例对象并实现了 sex特质
case object Male extends Sex
case object Female extends Sex
//创建一个Person类,他有两个成员(姓名,年龄)
case class Person(name: String,sex: Sex)
def main(args: Array[String]): Unit = {
//创建两个对象
val a =Person("张三",Male)
val b =Person("李四",Female)
//输出
println(s"a = ${a}")
println(s"b = ${b}")
}
}