scala class和case class的區別

scala中的case class和普通class的區別以下:java

一、初始化的時候能夠不用new,固然你也能夠加上,普通類必定須要加new;es6

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)

二、toString的實現更漂亮;app

scala> iteblog
res5: Iteblog = Iteblog(iteblog_hadoop)

三、默認實現了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

四、默認是能夠序列化的,也就是實現了Serializable ;oop

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 a = new A
a: A = $iwC$$iwC$A@71687b10
 
scala> oos.writeObject(a)
java.io.NotSerializableException: $iwC$$iwC$A

五、自動從scala.Product中繼承一些函數;
六、case class構造函數的參數是public級別的,咱們能夠直接訪問;es5

scala> iteblog.name
res11: String = iteblog_hadoop

七、支持模式匹配;scala

scala> case class A( a: Int )
defined class A

scala> case class B( b: String )
defined class B

scala> def classMath( x: AnyRef ): Unit = {
     |   x match {
     |     case A(a) => println( "A:" + a )
     |     case B(b) => println( "B:" + b )
     |     case A => println( A.apply(100) )
     |   }
     | }
classMath: (x: AnyRef)Unit

scala> val a = A( 1 )
a: A = A(1)

scala> val b = B( "b" )
b: B = B(b)

scala> classMath( a )
A:1

scala> classMath( b )
B:b
相關文章
相關標籤/搜索