六、scala面向對象-對象

1、對象es6

一、objectspring

object,至關於class的單個實例,一般在裏面放一些靜態的field或者method,第一次調用object的方法時,就會執行object的constructor,
也就是object內部不在method中的代碼,可是object不能定義接受參數的constructor。
object的constructor只會在其第一次被調用時執行一次,
之後再次調用就不會再次執行constructor了。

object一般用於做爲單例模式的實現,或者放class的靜態成員,好比工具方法。




###
scala> :paste
// Entering paste mode (ctrl-D to finish)

object Person {
  private var eyeNum = 2
  println("this is person object!")
  def getEyeNum = eyeNum
}

// Exiting paste mode, now interpreting.

defined object Person

scala> Person.eyeNum
<console>:12: error: variable eyeNum in object Person cannot be accessed in object Person
       Person.eyeNum
              ^

scala> Person.getEyeNum
this is person object!
res1: Int = 2

scala> Person.getEyeNum        #object裏的代碼只會執行一次,再次調用就不會執行了
res2: Int = 2


二、伴生對象vim

若是有一個class,還有一個與class同名的object,那麼就稱這個object是class的伴生對象,class是object的伴生類。
伴生類和伴生對象必須存放在一個.scala文件之中,伴生類和伴生對象,最大的特色在於,互相能夠訪問private field。


###
scala> :paste
// Entering paste mode (ctrl-D to finish)

class Person(val name: String, val age: Int) {
  def sayHello = println("Hi, " + name + ", I know you are " + age + "years old" + ", and usually you must have " + Person.eyeNum + " eyes.")
}

object Person {
  private val eyeNum = 2
  def getEyeNum = eyeNum
}

// Exiting paste mode, now interpreting.

defined class Person
defined object Person

scala> val p = new Person("leo", 30)
p: Person = Person@21588809

scala> p.sayHello
Hi, leo, I know you are 30years old, and usually you must have 2 eyes.


三、object繼承抽象類app

object的功能和class相似,除了不能定義接收參數的constructor以外,object也能夠繼承抽象類,並覆蓋抽象類中的方法。


###
scala> :paste
// Entering paste mode (ctrl-D to finish)

abstract class Hello(var message: String) {
  def sayHello(name: String): Unit
}

object HelloImpl extends Hello("hello") {
  override def sayHello(name: String) = {
  println(message + "," + name)
  }
}

// Exiting paste mode, now interpreting.

defined class Hello
defined object HelloImpl

scala> HelloImpl.sayHello("leo")
hello,leo


四、apply方法ide

object中重要的一個特殊方法,apply方法,一般在伴生對象中實現apply方法,並在其中實現構造伴生類的對象的功能。
而建立伴生類的對象時,一般不會使用new Class的方式,而是使用Class()的方式,隱式調用伴生對象的apply方法,讓對象建立更簡潔。
如Array類的伴生對象的apply方法就實現了接收可變數量的參數,並建立一個Array對象的功能。
scala> val a = Array(1,2,3,4,5)
a: Array[Int] = Array(1, 2, 3, 4, 5)



###
scala> :paste
// Entering paste mode (ctrl-D to finish)

class Person(val name: String)

object Person {
  def apply(name: String) = new Person(name)
}

// Exiting paste mode, now interpreting.

defined class Person
defined object Person

scala> val p1 = new Person("leo")
p1: Person = Person@6bf08014

scala> p1.name
res2: String = leo


scala> val p2 = Person("leo")
p2: Person = Person@2c07545f

scala> p2.name
res3: String = leo


五、main方法工具

在Scala中,main方法做爲應用程序的入口,Scala中的main方法定義爲def main(args:Array[String]),並且必須定義在object中。


###
[root@saltstack scala]# vim HelloWord.scala
object HelloWord {
  def main(args: Array[String]) {
    println("Hello Word!")
  }
}


[root@saltstack scala]# scalac HelloWord.scala 

[root@saltstack scala]# ls
HelloWord.class  HelloWord$.class  HelloWord.scala

[root@saltstack scala]# scala HelloWord
Hello Word!




除了本身實現main方法,還能夠繼承App Train,而後將須要在main方法中運行的代碼,直接做爲object的constructor代碼,並且用args能夠接受傳入的參數。


###
[root@saltstack scala]# vim HelloWord.scala 
object HelloWord extends App {
  if (args.length > 0) println("Hello, " + args(0))
  else println("Hello Word!")
}

[root@saltstack scala]# scalac HelloWord.scala 
[root@saltstack scala]# scala HelloWord
Hello Word!

[root@saltstack scala]# scala HelloWord leo
Hello, leo


六、用object來實現枚舉功能this

Scala沒有直接提供相似於Java的Enum枚舉特性,若是要實現枚舉,則須要用object繼承Enumeration,而且調用Value方法來初始化枚舉值。


###
scala> :paste
// Entering paste mode (ctrl-D to finish)

object Season extends Enumeration {
  val SPRING, SUMMER, AUTUMN, WINTER = Value
}

// Exiting paste mode, now interpreting.

defined object Season

scala> Season.SPRING
res4: Season.Value = SPRING



還能夠經過Value傳入枚舉值的id和name,經過id和toString能夠獲取,還能夠經過id和name來查找枚舉值。


###
scala> :paste
// Entering paste mode (ctrl-D to finish)

object Season extends Enumeration {
  val SPRING = Value(0, "spring")
  val SUMMER = Value(1, "summer")
  val AUTUMN = Value(2, "autumn")
  val WINTER = Value(3, "winter")
}

// Exiting paste mode, now interpreting.

defined object Season

scala> Season.SPRING.id
res5: Int = 0

scala> Season.SPRING.toString
res6: String = spring

scala> Season(0)
res7: Season.Value = spring

scala> Season(1)
res8: Season.Value = summer

scala> Season.withName("winter")
res9: Season.Value = winter

scala> for (ele <- Season.values) println(ele)  ##遍歷
spring
summer
autumn
winter
相關文章
相關標籤/搜索