package的概念
因為要對多個同名的類進(jìn)行命名空間的管理冗美,避免同名類發(fā)生沖突
比如說,scala.collection.mutable.Map和scala.collection.immutable.Map
package的定義
第一種方式: 多層級package定義(比較差的做法状答,一般不這么干)
package com {
package zj {
package scala {
class Test {}
}
}
}
第二種方式: 串聯(lián)式package定義(也不怎么樣冷守,一般也不這么干)
package com.zj.scala {
package service {
class Test {}
}
}
第三種方式: 文件頂部package定義
package com.zj.scala.service
class Test {
}
第四種方式: IDE自動生成包
package特性
特性一: 同一個包定義,可以在不同的scala源文件中的; 一個scala源文件內(nèi)惊科,可以包含兩個包
Test1.scala
package com {
package zj {
package scala {
class Test1
}
}
}
Test2.scala
package com {
package zj {
package scala {
class Test2
}
}
}
Test3.scala
package com {
package zj {
package scala1 {
class Test
}
}
}
package com {
package zj {
package scala2 {
class Test
}
}
}
特性二: 子包中的類拍摇,可以訪問父包中的類
Test.scala
package com {
package zj {
package scala {
object Utils {
def isNotEmpty(str: String): Boolean = str != null && str != ""
}
class Test
package service {
class MyService {
def sayHello(name: String) {
if(Utils.isNotEmpty(name)) {
println("Hello, " + name)
} else {
println("Who are you?")
}
}
}
}
}
}
}
object MainClass {
def main(args: Array[String]): Unit = {
val service = new com.zj.scala.service.MyService
service.sayHello("leo")
service.sayHello("")
}
}
特性三: 相對包名與絕對包名
package com {
package zj {
package scala {
object Utils {
def isNotEmpty(str: String): Boolean = str != null && str != ""
}
class Test
package collection {}
package service {
class MyService {
// 這會報錯,默認(rèn)使用相對報名馆截,從com.zj.scala.collection包中充活,尋找mutable包下的ArrayBuffer類
// 但是找不到,所以會報錯
// val names = new scala.collection.mutable.ArrayBuffer[String]
// 正確的做法是使用_root_蜡娶,引用絕對包名
val names = new _root_.scala.collection.mutable.ArrayBuffer[String]
def sayHello(name: String) {
if(Utils.isNotEmpty(name)) {
println("Hello, " + name)
} else {
println("Who are you?")
}
}
}
}
}
}
}
特性四: 定義package對象(比較少)
package內(nèi)的成員混卵,可以直接訪問package對象內(nèi)的成員
package com.zj.scala
package object service {
val defaultName = "Somebody"
}
package service {
class MyService {
def sayHello(name: String) {
if(name != null && name != "") {
println("Hello, " + name)
} else {
println("Hello, " + defaultName)
}
}
}
}
特性五: package可見性
package com.zj.scala
class Person {
private[scala] val name = "leo"
private[zj] val age = 25
}
import
如果沒有import,那么窖张。幕随。。你每次創(chuàng)建某個包下的類的對象宿接,都得用new com.zj.scala.service.MyService這種冗長的格式赘淮。。睦霎。
所以如果用了import梢卸,那么。副女。低剔。你只要先import com.zj.scala.service.MyService,然后再new MyService肮塞,即可。姻锁。枕赵。
import com.zj.scala.service.MyService;
object MainClass {
def main(args: Array[String]): Unit = {
val service = new MyService
service.sayHello("leo")
service.sayHello("")
}
}
import特性
特性一: 用import com.zj.scala.service._這種格式,可以導(dǎo)入包下所有的成員
特性二: scala與java不同之處在于位隶,任何地方都可以使用import拷窜,比如類內(nèi)、方法內(nèi)涧黄,這種方式的好處在于篮昧,可以在一定作用域范圍內(nèi)使用導(dǎo)入
object MainClass {
def main(args: Array[String]): Unit = {
import com.zj.scala.service._
val service = new MyService
service.sayHello("leo")
service.sayHello("")
}
}
特性三: 選擇器、重命名笋妥、隱藏
import com.zj.scala.service.{ MyService }懊昨,僅僅導(dǎo)入java.awt包下的Color和Font類
import com.zj.scala.service.{ MyService => MyServiceImpl },將導(dǎo)入的類進(jìn)行重命名
import java.util.{ HashMap => _, _ }春宣,導(dǎo)入java.util包下所有的類酵颁,但是隱藏掉HashMap類
特性四: 隱式導(dǎo)入
每個scala程序默認(rèn)都會隱式導(dǎo)入以下幾個包下所有的成員
import java.lang._
import scala._
import Predef._