Scala class和case class的区别

Scala中存在case class,它其实就是一个普通的class。但是它又和普通的class略有区别,如下:

1、初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new;

scala> case class Iteblog(name:String)

defined class Iteblog

scala> val iteblog = Iteblog("iteblog_hadoop")

iteblog: Iteblog = Iteblog(iteblog_hadoop)

scala> val iteblog = new Iteblog("iteblog_hadoop")

iteblog: Iteblog = Iteblog(iteblog_hadoop)

2、toString的实现更漂亮;

scala> iteblog

res5: Iteblog = Iteblog(iteblog_hadoop)

3、默认实现了equals 和hashCode;

scala> val iteblog2 = Iteblog("iteblog_hadoop")

iteblog2: Iteblog = Iteblog(iteblog_hadoop)

scala> iteblog == iteblog2

res6: Boolean = true

scala> iteblog.hashCode

res7: Int = 57880342

4、默认是可以序列化的,也就是实现了Serializable ;

scala> class A

defined class A

scala> import java.io._

import java.io._

scala> val bos = new ByteArrayOutputStream

bos: java.io.ByteArrayOutputStream =

scala> val oos = new ObjectOutputStream(bos)

oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@4c257aef

scala> oos.writeObject(iteblog)

scala> val = new A

a: = $iwC$$iwC$A@71687b10

scala> oos.writeObject(a)

java.io.NotSerializableException: $iwC$$iwC$A

5、自动从scala.Product中继承一些函数;
6、case class构造函数的参数是public级别的,我们可以直接访问;

scala> iteblog.name

res11: String = iteblog_hadoop

7、支持模式匹配;

其实感觉case class最重要的特性应该就是支持模式匹配。这也是我们定义case class的唯一理由,难怪Scala官方也说:It makes only sense to define case classes if pattern matching is used to decompose data structures. 。来看下面的例子:

object TermTest extends scala.App {

  def printTerm(term: Term) {

    term match {

      case Var(n) =>

        print(n)

      case Fun(x, b) =>

        print("^" + x + ".")

        printTerm(b)

      case App(f, v) =>

        print("(")

        printTerm(f)

        print(" ")

        printTerm(v)

        print(")")

    }

  }

  def isIdentityFun(term: Term): Boolean = term match {

    case Fun(x, Var(y)) if == =true

    case _ =false

  }

  val id = Fun("x", Var("x"))

  val = Fun("x", Fun("y", App(Var("x"), Var("y"))))

  printTerm(t)

  println

  println(isIdentityFun(id))

  println(isIdentityFun(t))

}

原文地址:https://www.cnblogs.com/runnerjack/p/8621442.html

时间: 2024-08-24 19:03:01

Scala class和case class的区别的相关文章

scala学习手记 - case表达式里的模式变量和常量

再来看一下之前的一段代码: def process(input: Any) { input match { case (a: Int, b: Int) => println("Processing (int, int)... ") case (a: Double, b: Double) => println("Processing (double, double)... ") case msg: Int if (msg > 1000000) =&g

Scala匹配模式---Case 类匹配

让我们来尝试一次深度匹配,在我们的模式匹配中检查对象的内容. //code-examples/Rounding/match-deep-script.scala case class Person(name: String, age:Int) val alice = new Person("Alice",25) val bob = new Person("Bob",32) val charlie = newPerson("Charlie", 32)

Scala中class和object的区别

1.class scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C#的简易属性类似:若使用了private修饰,则它的方法也将会是私有的.这就是所谓的统一访问原则. [java] view plain copy print? //类默认是public级别的 class Person{ var age=18  //字段必须得初始化() def Age=age //这

【Todo】【转载】Scala中Array, List, Tuple的区别

参考了这篇文章: https://my.oschina.net/u/1034176/blog/512314 1. 在Scala 2.7中,Array.List都不能混合类型,只有Tuple可以:而在Scala以上版本中,3者的元素都可以混合不同的类型(转化为Any类型),只不过是当使用混合类型时,Array和List会将元素类型转化为Any类型,而Tuple则保留每一个元素的初始类型. 2. 可变性 3. 关于初始化 Array 1) val array= new Array[String](3

scala 关于Array,List,Tuple的区别

在Scala 2.7中,Array.List都不能混合类型,只有Tuple可以:而在Scala以上版本中,3者的元素都可以混合不同的类型(转化为Any类型),只不过是当使用混合类型时,Array和List会将元素类型转化为Any类型,而Tuple则保留每一个元素的初始类型: 关于Array,List,Tuple 关于初始化 1) val array= new Array[String](3) // Array(null, null, null)相当于声明了3个null值的空元素 val arra

Scala中 object 和 class的区别

object 在scala中没有静态方法和静态字段,所以在scala中可以用object来实现这些功能,直接用对象名调用的方法都是采用这种实现方式,例如Array.toString.对象的构造器在第一次使用的时候会被调用,如果一个对象从未被使用,那么他的构造器也不会被执行:对象本质上拥有类(scala中)的所有特性,除此之外,object还可以一扩展类以及一个或者多个特质:例如, abstract class ClassName(val parameter){} object Test exte

Scala 中Array,List,Tuple的区别

虽然学了一段时间的Scala了,但是总觉得基础不是太扎实,还有很多的基础知识比较模糊,于是最近又打算重新学习基础. Scala中的三种集合类型包括:Array,List,Tuple.那么到底这三种有哪些异同呢?说实话,我之前一直没弄明白,所以今天特意花了点时间学习了一下. 相同点: 1.长度都是固定的,不可变长 2.早期的Scala版本,Array.List都不能混合类型,只有Tuple可以,2.8版本以后,3者的元素都可以混合不同的类型(转化为Any类型) 不同点: 1.Array 中的元素值

Scala中 => Unit 与 () =>Unit的区别

() => Unit ---> 是一个函数:=> Unit --> 是一个执行结果为Unit的表达式 code: => Unit是 by name 传递参数.参数是一个返回值为Unit的代码块.在传递的时候,参数没有被调用.比如: def test(code : => Unit){ println("start") code // 这行才会调用传入的代码块,写成code()亦可 println("end") } test{// 此

每天学一点Scala之 方法与函数的区别