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