class

你可以使用class关键字定义一个类,后面跟着它的名字和构造参数。使用方法和Java中的class相似。

使用new关键字创建一个类的实例。

case class

Scala有一种特殊的类叫做样例类(case class)。默认情况下,样例类一般用于不可变对象,并且可作值比较。你可以使用case class关键字来定义样例类。

你可以不用new关键字来实例化样例类。

case class Point(x: Int, y: Int)

val point = Point(1, 2)
val anotherPoint = Point(1, 2)
val yetAnotherPoint = Point(2, 2)

比较

// 案例类在比较的时候是按值比较而非按引用比较

case class Message(sender: String, recipient: String, body: String)

val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val messagesAreTheSame = message2 == message3  // true

// 尽管message2和message3引用不同的对象,但是他们的值是相等的,所以message2 == message3为true。

拷贝

// 你可以通过copy方法创建一个案例类实例的浅拷贝,同时可以指定构造参数来做一些改变。

case class Message(sender: String, recipient: String, body: String)
val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
message5.sender  // travis@washington.us
message5.recipient // claire@bourgogne.fr
message5.body  // "Me zo o komz gant ma amezeg"

// 上述代码指定message4的recipient作为message5的sender,指定message5的recipient为”claire@bourgogne.fr”,而message4的body则是直接拷贝作为message5的body了。

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

object

单例对象是一种特殊的类,有且只有一个实例。和惰性变量一样,单例对象是延迟创建的,当它第一次被使用时创建。

当对象定义于顶层时(即没有包含在其他类中),单例对象只有一个实例。

当对象定义在一个类或方法中时,单例对象表现得和惰性变量一样。

伴生对象

当一个单例对象和某个类共享一个名称时,这个单例对象称为 伴生对象。 同理,这个类被称为是这个单例对象的伴生类。类和它的伴生对象可以互相访问其私有成员。使用伴生对象来定义那些在伴生类中不依赖于实例化对象而存在的成员变量或者方法。

import scala.math._

case class Circle(radius: Double) {
  import Circle._
  def area: Double = calculateArea(radius)
}

object Circle {
  private def calculateArea(radius: Double): Double = Pi * pow(radius, 2.0)
}

val circle1 = Circle(5.0)

circle1.area

这里的 class Circle 有一个成员 area 是和具体的实例化对象相关的,单例对象 object Circle 包含一个方法 calculateArea ,它在每一个实例化对象中都是可见的。

case object

case object 是没有参数输入,所以没有apply 和unapply的方法

class 和 object 区别

1.单例对象不能带参数,类可以
2.对象可以和类名一样时,object被称为伴生对象,class被称为伴生类;
3.类和伴生对象可以相互访问其私有属性,但是它们必须在一个源文件当中;
4.类只会被编译,不会被执行。要执行,必须在Object中。

case class 与 class 区别

1.初始化的时候可以不用new,也可以加上,但是普通类必须加new;
2.默认实现了equals、hashCode方法;
3.默认是可以序列化的,实现了Serializable;
4.自动从scala.Product中继承一些函数;
5.case class 构造函数参数是public的,我们可以直接访问;
6.case class默认情况下不能修改属性值;
7.case class最重要的功能,支持模式匹配,这也是定义case class的重要原因。

case class 和 case object 区别

1.类中有参和无参,当类有参数的时候,用case class ,当类没有参数的时候那么用case object。