Scala學習之物件
1、object
object相當於class的單個例項,通常在裡面放一些靜態的field或者method
第一次呼叫object的方法時,就會執行object的constructor,也就是object內部不在method中的程式碼;但是object不能定義接受引數的constructor
注意,object的constructor只會在其第一次被呼叫時執行一次,以後再次呼叫就不會再次執行constructor了 object通常用於作為單例模式的實現,或者放class的靜態成員,比如工具方法
object Person {
private var eyeNum = 2
println("this Person object!" )
def getEyeNum = eyeNum
}
2、伴生物件
如果有一個class,還有一個與class同名的object,那麼就稱這個object是class的伴生物件,class是object的伴生類。
伴生類和伴生物件必須存放在一個.scala檔案之中。
伴生類和伴生物件,最大的特點就在於,互相可以訪問private field。
object Person {
private val eyeNum = 2
def getEyeNum = eyeNum
}
class Person(val name: String, val age: Int) {
def sayHello = println("Hi, " + name + ",
I guess you are " + age
+ " years old!" + ", and usually you must have "
+ + Person.eyeNum + " eyes.")
}
3、讓object繼承抽象類
object的功能其實和class類似,除了不能定義接受引數的constructor之外 object也可以繼承抽象類,並覆蓋抽象類中的方法
abstract class Hello(var message: String) {
def sayHello(name: String): Unit
}
object HelloImpl extends Hello("hello") {
override def sayHello(name: String) = {
println(message + ", " + name)
}
}
4、apply方法
object中非常重要的一個特殊方法,就是apply方法
通常在伴生物件中實現apply方法,並在其中實現構造伴生類的物件的功能
而建立伴生類的物件時,通常不會使用new Class的方式,而是使用Class()的方式,隱式地呼叫伴生物件得apply方法,這樣會讓物件建立更加簡潔
// 比如,Array類的伴生物件的apply方法就實現了接收可變數量的引數,並建立一個Array物件的功能
val a = Array(1, 2, 3, 4, 5)
// 比如,定義自己的伴生類和伴生物件
class Person(val name: String)
object Person {
def apply(name: String) = new Person(name)
}
5、main方法
就如同java中,如果要執行一個程式,必須編寫一個包含main方法類一樣
在scala中,如果要執行一個應用程式,那麼必須有一個main方法,作為入口
scala中的main方法定義為def main(args: Array[String]),而且必須定義在object中
object HelloWorld {
def main(args: Array[String]) {
println("Hello World!!!")
}
}
// 除了自己實現main方法之外,還可以繼承App Trait
// 然後將需要在main方法中執行的程式碼,直接作為object的constructor程式碼;而且用args可以接受傳入的引數
object HelloWorld extends App {
if (args.length > 0) println("hello, " + args(0))
else println("Hello World!!!")
}
如果要執行上述程式碼,需要將其放入.scala檔案,然後先使用scalac編譯,再用scala執行
scalac HelloWorld.scala
scala -Dscala.time HelloWorld
App Trait的工作原理為:App Trait繼承自DelayedInit Trait,scalac命令進行編譯時,會把繼承App Trait的object的constructor程式碼都放到DelayedInit Trait的delayedInit方法中執行
6、用object來實現列舉功能
Scala沒有直接提供類似於Java中的Enum這樣的列舉特性
如果要實現列舉,則需要用object繼承Enumeration類,並且呼叫Value方法來初始化列舉值
object Season extends Enumeration {
val SPRING, SUMMER, AUTUMN, WINTER = Value
}
// 還可以通過Value傳入列舉值的id和name,通過id和toString可以獲取; 還可以通過id和name來查詢列舉值
object Season extends Enumeration {
val SPRING = Value(0, "spring")
val SUMMER = Value(1, "summer")
val AUTUMN = Value(2, "autumn")
val WINTER = Value(3, "winter")
}
Season(0)
Season.withName("spring")
// 使用列舉object.values可以遍歷列舉值
for (ele <- Season.values) println(ele)