1. 包 package
- 源文件目錄和包之間並沒有強制的關聯關係。比如下面Manager.scala不一定要在
./com/horstmann/impatient
目錄中。
// Manager.scala
package com {
package horstmann {
package impatient {
class Manager(name: String) {
def description = "A manager with name " + name
}
}
}
}
- 同一個文件中可以給多個包貢獻內容,比如Employee.scala文件可以包含:
package com {
package horstmann {
package impatient {
class Employee(id: Int) {
def description = "An employee with id " + id
}
}
}
}
package org {
package bigjava {
class Counter {
private var value = 0
def increment() { value += 1 }
def description = "A counter with value " + value
}
}
}
2. 作用域規則
Scala的包作用域支持嵌套,包路徑都是相對的。
java.lang
、scala
和Predef
總是被引入,這種引入被稱爲隱式引入。
3. 串聯式包語句
- 包語句可以包含一個“串”或者說是“路徑區段”
package com.horstmann.impatient {
package people {
class Person(val name: String) {
val friends = new collection.mutable.ArrayBuffer[Person]
// com和com.hosrstmann的成員這裏不可見
def description = name + " with friends " +
friends.map(_.name).mkString(", ")
}
}
}
4. 文件頂部標記法
- 可以在文件頂部使用
package
語句,不帶花括號。
package com.horstmann.impatient
class Car
5. 包對象
- 每個包都可以有一個包對象,要在父包中定義它,且名稱與子包一樣。
package com.horstmann.impatient
package object people {
val defaultName = "John Q. Public"
}
package people {
class Person {
var name = defaultName // A constant from the package
def description = "A person with name " + name
}
}
// Run as scala com.horstmann.impatient.Main
object Main extends App {
val john = new com.horstmann.impatient.people.Person
println(john.description)
}
6. 包可見性
- 沒有被public、private或protected聲明的類成員,在包含該類的包中可見,可以使用
private[包名]
達到同樣效果。
package com.horstmann.impatient
package object people {
val defaultName = "John Q. Public"
}
package people {
class Person {
var name = defaultName // A constant from the package
private[impatient] def description = "A person with name " + name
}
}
7. 引入import
引入讓你可以使用更短的名稱
import java.awt.Color
引入包的全部成員,也可以引入類或對象的全部成員。
import java.awt._
任何地方都可以出現import引入,作用到該塊的結尾。
8. 重命名和隱藏方法
只項引入幾個成員,使用選擇器。
import java.awt.{Color, Font}
重命名選到的成員。
import java.util.{HashMap => JavaHashMap}
HashMap => _
是用來隱藏某個成員。
【待續】