zoukankan      html  css  js  c++  java
  • Scala中的样例类详解

    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"学生:$name, $age, $stuNo")
          case Teacher(name, age, teaNo) => println(s"老师:$name, $age, $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除了在模式匹配时能发挥其强大的威力之外,在进行其它应用时,也显示出了其强大的功能。*/
    
      }
    }
    

      https://blog.csdn.net/accptanggang/article/details/78575710

  • 相关阅读:
    容器(四)实现容器的底层技术【25】
    容器(四)限制容器的 Block IO【24】
    容器(四)限制容器对CPU的使用【23】
    容器(四)限制容器对内存的使用【22】
    容器(四)一张图搞懂容器所有操作【21】
    容器(四)容器常用操作【20】
    容器(四)运行容器的最佳实践【19】
    容器(四)进入容器的方法【18】
    容器(四) 运行容器方法【17】
    51单片机学习笔记
  • 原文地址:https://www.cnblogs.com/-courage/p/14583530.html
Copyright © 2011-2022 走看看