本章要点
- 包也可以像内部类那样嵌套
- 包路径不是绝对路径
- 包声明链x.y.z并不自动将中间包x和x.y变成可见
- 位于文件顶部不带花括号的包声明在整个文件范围内有效
- 包对象可以持有函数和变量
- 引入语句可以引入包,类和对象
- 引入语句可以出现在任何位置
- 引入语句可以重命名和隐藏特定成员
- java.lang,scala和predef总是被引入
1、同一个class名称可以出现在不同的package中,访问需要使用完全限定的名称
与对象和类不同,同一个包可以定义在多个文件中
2、作用域规则
scala的包和其它作用域一样的支持嵌套,你可以访问上层作用域中的名称。
utils定义于父包,所有的父包内容都在作用域内,没必要使用com.horstmann.utils.prcentof。但是这种方法存在问题,有可能会出现想引用某个包,
却只找到父包下某个包的情况。(scala包总被引入)
3、串联式包语句
package com.horstmann.impatient {
package people {
class Person
...
}
}
这样的包语句限定了可见的成员。现在com.horstmann.collection包不会再被访问到。
4、文件顶部标记法
package com
package horstmann
package impatient
package people
class Person
...
等同于
package com.horstmann.impatient{
package people {
class Person
}
}
第一个示例中,com,horstmann,impatient三个包的内容是可见的,可以直接被引用。而第二个方法中,只有 com.horstmann.impatient和people可以这么用。
5、包对象
包可以含类,对象和特质,但是不能含有函数或者变量的定义。把工具函数或常量添加到包而不是某个utils对象,这是更合理的做法
包对象正是解决这个问题的。
每个包都有一个包对象,需要在父包中定义,且名称与子包一样。
注意defaultname不需要加限定词,因为它位于同一个包内。在其他地方,这个常量可以用com.horstmann.impatient.people.defaultname访问到
6、包可见性
在java中,没有被声明为public,private或者protected的类成员在包含该类的包中可见。
7、引入
引入语句让你可以使用较短的名称
8、任何地方都可以声明引入
在scala中,import语句可以出现在任何地方,并不局限在文件顶部。import语句的效果一直延伸到包含该语句的块末尾。
9、重命名和隐藏方法
如果想引入包中的几个成员,可以这样使用 选取器(selector)
import java.awt.{Color,Font}
选取器语句还允许你重命名选到的成员:
import java.util.{hashmap=>javahashmap}
选取器HashMap=>_将隐藏某个成员
10、隐式引入
每个scala程序都隐式的以下列代码开始:
import java.lang
import scala
import Predef._
scala引入会覆盖java.lang,predef对象也会被引入