Scala中的样例类

/**
  * 样例类Case Class
  * Case Class一般被翻译成样例类,它是一种特殊的类,能够被优化以用于模式匹配。
  * 当一个类被声名为case class的时候,scala会帮助我们做下面几件事情:
  * 1、构造器中的参数如果不被声明为var的话,它默认的是val类型的,但一般不推荐将构造器中的参数声明为var。
  * 2、自动创建伴生对象,同时在里面给我们实现子apply方法,使我们在使用的时候可以不直接使用new创建对象。
  * 3、伴生对象中同样会帮我们实现unapply方法,从而可以将case class应用于模式匹配。
  * 4、实现自己的toString、hashCode、copy、equals方法
  * 除此之此,case class与其它普通的scala类没有区别
  */
//抽象Person类
abstract class Person

//样例类Student
case class Student(name: String, age: Int, stuNo: String) extends Person

//样例类Teacher
case class Teacher(name: String, age: Int, teaNo: String) extends Person

//样例类 Nobody
case class Nobody(name: String) extends Person

object CaseClassDemo {
def main(args: Array[String]): Unit = {
//case class会自动生成apply方法,创建对象时无需用new
val p: Person = Student(“lisi”, 20, “101”)
//match case模式匹配
p match {
case Student(name, age, stuNo) => println(s"学生:KaTeX parse error: Expected 'EOF', got '#' at position 40: …n style="color:#̲008000"><strong…age, KaTeX parse error: Expected 'EOF', got '#' at position 41: …n style="color:#̲008000"><strong…name, KaTeX parse error: Expected 'EOF', got '#' at position 39: …n style="color:#̲008000"><strong…teaNo)
case Nobody(name) => println(s"其他人:$name)
}
/case class常用方法,定义case class便会自动生成对应的toString,hashCode,equals,copy等方法,/

val teacher = Teacher(“jack”, 30, “0010”)
//toString方法
println(teacher.toString)
//无参copy方法
val teacher2 = teacher copy()
/特别注意:
equals方法是检查值是否相等,而eq方法检查的是引用是否相等,
所以如果比较的对象是null那么==调用的是eq,不是null的情况调用的是equals。
在Java中如果要对两个对象进行值比较,那么必须要实现equals 和hashCode方法。
而在scala中为开发者提供了case class,默认实现了equals 和hashCode方法。/
//eq方法进行比较
println(teacher.eq(teacher2))
//equals方法根据对象内容进行比较
println(teacher equals (teacher2))
//方法进行比较
println(teacher == teacher2)
hashcode方法
println(teacher hashCode())
println(")
println(teacher2.toString)
//带一个参数的copy方法
println(teacher2.copy(“tony”).toString)
//带二个参数的copy方法
println(teacher2.copy(“tony”, 25).toString)
//带三个参数的copy方法
println(teacher2.copy(“tony”, 25, “1002”).toString)
println(”==")
/case class在实用应用中的用途:
某个类一旦被定义为case class,则编译器会自动生成该类的伴生对象,伴生对象中包括了apply方法及unapply方法,
apply方法使得我们可以不需要new关键字就可以创建对象,
而unapply方法,则使得可以方便地应用在模式匹配当中,
另外编译器还自动地帮我们实现对应的toString、equals、copy等方法。
在实际中,case class除了在模式匹配时能发挥其强大的威力之外,在进行其它应用时,也显示出了其强大的功能。/

}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值