Scala 學習(6)之「對象」

object

  • 至關於 class 的單個實例,一般在裏面放一些靜態的 field 或者 method,第一次調用 object 的方法時,就會執行 object 的 constructor,也就是 object 內部不在 method 中的代碼,須要注意的是,object 不能定義接受參數的 constructor
  • object 的 constructor 只會在其第一次被調用時執行一次,之後再調用就不會再次執行了
  • object 一般用於單例模式的實現,或者放 class 的靜態成員,好比工具方法 object,一般在裏面放一些靜態的 field 或者 method
object People {
	private var mouthNum = 1
	println("this People object!")
	def getMouthNum = mouthNum
}
People.getMouthNum

執行程序以後能夠看到,構造方法只被調用了一次。編程

伴生對象

  • 若是一個程序中,若是有一個 class,還有一個與 class 同名的 object,那麼就稱這個 object 是 class 的伴生對象, class 是 object 的伴生類
  • 伴生類和伴生對象必須存放在一個 .scala 文件之中
  • 伴生類和伴生對象,最大的特色就在於,它們互相能夠訪問彼此的 private field
object People {
	private val mouthNum = 1
	def getMouthNum = mouthNum
}

class People(val name: String, val age: Int) {
	def sayHello = println("Hi, " + name + ", I guess you are " + age + " years old!" + ", and you have " + People.mouthNum + " mounth.")
}

val people = new People("0mifang", 18)

// Hi, 0mifang, I guess you are 18 years old!, and you have 1 mounth.
people.sayHello

繼承抽象類

  • object 的功能其實和 class 相似,除了不能定義接受參數的 constructor 以外,object 也能夠繼承抽象類,並覆蓋抽象類中的方法
abstract class Eat(var message: String) {
	def eat(food: String): Unit
}

object EatImpl extends Eat("0mifang") {
	override def eat(food: String) = {
		println(message + " eat an " + name)
	}
}

EatImpl.sayHello("ice cream")

apply方法

  • 一般在伴生對象中實現 apply 方法,並在其中實現構造伴生類的對象的功能,而建立伴生類的對象時,一般不會使用 new Class 的方式,而是使用 Class() 的方式,隱式地調用伴生對象得 apply 方法,這樣會讓對象建立更加簡潔
class Person(val name: String)	//建立伴生類
object Person {	//建立伴生對象
	def apply(name: String) = new Person(name)
}

val p1 = new Person("0mifang1")
val p2 = Person("0mifang2")

main方法

  • 須要使用命令行敲入 scalac 編譯源文件而後再使用 scala 執行
  • Scala 中的 main 方法定義爲 def main(args: Array[String]) ,並且必須定義在 object 中
object Test {
	def main(args: Array[String]) {
		println("I'm learning the Scala!!!")
	}
}
  • 除了本身實現 main 方法以外,還能夠繼承 App Trait,而後將須要在 main 方法中運行的代碼,直接做爲 object 的 constructor 代碼;並且用 args 能夠接受傳入的參數
  • App Trait 的工做原理爲:App Trait 繼承自 DelayedInit Trait,scalac 命令進行編譯時,會把繼承 App Trait 的 object 的 constructor 代碼都放到 DelayedInit Trait 的 delayedInit 方法中執行
object Test extends App {
	if (args.length > 0) println("hello, " + args(0))
	else println("Hello World!!!")
}

用 object 來實現枚舉功能

  • 須要用 object 繼承 Enumeration 類,而且調用 Value 方法來初始化枚舉值
object Color extends Enumeration {
	val RED, BLUE, YELLOW, WHITE, BLACK = Value
}
Color.RED
  • 還能夠經過 Value 傳入枚舉值的 id 和 name,經過 .id.toString 能夠獲取; 還能夠經過 id 和 name 來查找枚舉值
object Color extends Enumeration {
	val RED = Value(0, "red")
	val BLUE = Value(1, "blue")
	val YELLOW = Value(2, "yellow")
	val WHITE = Value(3, "white")
	val BLACK = Value(4, "black")
}
Color(0)
Color.withName("red")
  • 使用枚舉 object.values 能夠遍歷枚舉值
for (ele <- Color.values) println(ele)

歡迎關注,本號將持續分享本人在編程路上的各類見聞。app

相關文章
相關標籤/搜索