scala包和引入
1.scala包
scala的包和Java中的包的目的是相同的:管理大型程序中的名称。要增加条目到包中,可以将其包含在包语句里面,如:
package org{
package cai{
package test{
class MyClass
// ......
}
}
}
MyClass就可以在任何地方以org.cai.test.MyClass被访问。
**源文件的目录和包之间并没有强制的关联关系,并不需要将MyClass.scala放在org/cai/test目录下面。
**可以在一个.scala文件中定义多个包的内容,如:
//包org.cai.test
package org{
package cai{
package test{
class MyClass1
// ......
}
}
}
//包org.yong.test
package org{
package yong{
package test{
class MyClass2
//......
}
}
}
2.包的作用域
scala的包和其它作用域一样支持嵌套。可以在程序中访问上层作用域中的名称。有时候包的引入会发生冲突,这个时候我们可以通过绝对包名进行引入:
绝对包名以“_root_”开始。
val test = new _root_.scala.collection.mutable.ArrayBuffer[claaName]
3.串联式包语句
包语句可以包含一个串(路径区段),这样的包语法限定了可见的成员。package org.cai.test{
//org和org.cai的成员在这里不可见
package pack1{
class MyClass
//......
}
}
4.文件顶部标记法
和Java类似,在源文件顶部声明包。如:
package org.cai.test
package yong
class MyClass
//......
//这等同于
package org{
package cai{
package test{
package yong{
class MyClass1
// ......
}
}
}
}
注意:在上例子中,文件所有的内容都属于org.cai.test.yong包,但是org.cai.test包的内容是可见的,可以被直接引用。
5.包对象
包可以包含类、对象和特质,但是不能包含函数或变量的定义。这是Java虚拟机的局限。每一个包都可以有一个包对象,需要在父包中定义它,且名称与子包一样。
例如:
package org.cai.test
package object people{
val defaultName = "cy"
}
package people{
class Person{
var name = defaultName //从包对象拿到常量
}
//......
}
defaultName不需要加限定词,因为它位于同一个包内。在其它地方,这个常量可以用org.cai.test.people.defaultName来访问到。包对象会被编译成带有静态方法和字段的JVM类,名为package.class,位于相应的包下。
6.包可见性
在Java中,没有被声明为private、protected和public的类成员在包含该类的包中可见,在scala中,可以通过修饰符达到同样的效果。//声明方法在自己的包中可见
package org.cai.test
class Person{
private[test] def func = ""
//......
}
//将方法的可见度提升到上一层
package org.cai.test
class Person{
private[cai] def func = ""
//......
}
7.包的引入
scala引入包和java一样。
import org.cai._ "_"和Java中的"*"通配符一样,表示引入对应路径下的所有类或对象的所有成员。
在scala中,import语句可以出现在任何地方,并不是仅仅限于文件顶部。
import进来的成员的作用效果延伸到包含该语句的块末尾。
8.包重命名和隐藏方法
(1)包重命名如果要引入包中的多个成员,可以使用选取器,如下:
import java.awt.{Color,Font}
可以重命名选取的包成员:
import java.util.{HashMap=>JavaHashMap}
这样一来,JavaHashMap就是java.util.HashMap
(2)隐藏方法
“成员 => _”将隐藏某一个成员而不是重命名,这仅仅在需要引入其它同
名成员时候有用,如:
import java.util.{HashMap=>_,_}
import scala.collection.mutable._
现在,HashMap无二义性地指向scala.collection.mutable.HashMap,因为java.util.HashMap被隐藏了。
9.隐式引入
每一个scala程序都隐式地引入了如下代码:import java.lang._
import scala._
import Predef._
和Java程序一样,lang包总是被引入,接下来引入scala包,这个引入会覆盖之前的引入,最后,Predef包被引入,这个包中包含了很多有用的函数。
>>>>>__以上内容摘自:《快学Scala》 [美]Cay S. Horstmann著 电子工业出版社__<<<<<