在Scala中包的做用和Java或C++中相同,比起Java中的package,Scala中支持這樣的package定義:java
package com{ package hyc{ package test{ class Hello{ ... } } } }
這樣使得你能夠在一個原文件中編寫多個包的程序,而且他們不受文件夾名稱和位置的限制。this
Scala 每一個嵌套的包有着本身的做用域,而且上層做用域能夠被下層做用域訪問。spa
package com{ package hyc{ object Hello{ def out() : Unit = {println("Hello")} } package test{ class World{ def out() : Unit = {Hello.out + " " + println("World")} } } } }
咱們能夠看到對象Hello的同級包下的World類,能夠直接引用對象Hello的方法。scala
不過這樣會有一個瑕疵,界定以下代碼:code
package com { package horstman{ package impatient{ class Manager{ val sub = new collection.mutable.ArrayBuffer[Int] } } } }
這裏咱們引用了一個特性,那就是scala包老是被引入的,所以collection包老是指向scala.collection。對象
假定有以下包,可能在另外一個文件中:作用域
package com { package horstman{ package collection{ ... } } }
這樣編譯將會出錯由於此時上面的collection包的引用指向了這裏的com.horstman.collection,裏面並無mutable包,所以報錯。it
解決方法是使用絕對包名,在以_root_開始,或者直接不省略scalaio
package com { package horstman{ package impatient{ class Manager{ val sub = new _root_.collection.mutable.ArrayBuffer[Int] //或者val sub = new scala.collection.mutable.ArrayBuffer[Int] } } } }
package com.horstman.impatient{ //com和horstman的成員在這裏不可見 package people{ class Person{ ... } } }
這樣的包語句限定了可見成員。編譯
package com.horstman.impatient package people class Person{ ... }
這樣等同於
package com.horstman.impatient{ package people{ class Person{ ... } } }
每一個包均可以有一個包對象,包對象的定義以下:
package com.horstman.impatient //這是一個包對象 package object people{ }
包對象被編譯以後,在會在 包名全路徑.包對象名稱 的包名下 生成package.class 和package$.class 和單例對象同樣。
如何從包對象中取出變量呢?
package com.horstman.impatient //這是一個包對象 package object people{ val defaultName = "Name" } package people{ class Person{ var str = defaultName//從包對象拿到常量 } }
在Java中,沒有被聲明爲public、private或protected的類成員在包含類的包中可見。Scala中能夠經過修飾符達到一樣的效果:
private[package|this]
例如:
package com.horstman.impatient.people class Person{ private[people] def name() println("tom") //也能夠焰斬道上層包private[impatient] def name() println("tom") }
在Scala中,你能夠用以下方式引入你須要的類或對象。
import a.b.c.A //只導入a.b.c包下的A import a.b.c._ //導入a.b.c包下的所有 import a.b.c.{A,B} //導入a.b.c包下的A 和B import a.b.c.{A => MyA} //只導入a.b.c包下的A 並將A重命名爲MyA import java.util.{HashMap => _ , _} //將java.util.HashMap隱藏,使其不被引入。
Scala中能夠在任意位置聲明import 。
每一個Scala程序都是隱式的從以下代碼開始的:
import java.lang._ import scala._ import Predef._
和Java正序同樣java.lang包老是被引入。接下來scala包也被引入,不過方式有些特殊。不像其餘引入,scala引入能夠覆蓋以前的引入。
scala包時默認被引入的,所以在引入scala包時能夠省略scala關鍵字。例如:
import collection.mutable.ArrayBuffer
等同於
import scala.collection.mutable.ArrayBuffer