此章是有关包(package)和引入(import)的讲解,相对来说比较简单,所以就不大篇幅的来赘述。
11.1 包(package)
scala中的包的概念和java目的是一样的。
但也有不同之处:
- 支持嵌套
- 包名和类所在目录无关
11.1.1 包定义
例子如下:
package com {
package horstmann {
package impatient {
class Employee{
var salary:Double=1;
var empNo:Int=0;
}
}
}
}
或和java一样的方式,如下
package com.horstmann.impatient {
package people {
class Person{
}
}
}
或
package com.horstmann.impatient
package people
class Person{
}
11.1.2 作用域规则
在Scala中,包的作用域比起java来更加前后一致。Scala的包和其他作用域一样地支持嵌套,你可以访问上层作用域中的名称。例如:
package com.horstmann.impatient
package people
class Person{
}
注意Utils.percentOf修饰符。Utils类定义于父包,所有父包中的内容都在作用域内,因此没必要使用com.horstmann.Utils.precentOf
11.1.3 包对象
包可以包含类、对象和特质,但不能包含函数或变量的定义。很不幸,这是Java虚拟机的局限。把工具函数或常量添加到包而不是某个Utils对象,这是更加合理的做法。包对象的出现正是为了解决这个局限。每个包都可以有一个包对象。你需要在父包中定义它,且名称与子包一样。例如:
package com.horstmann.impatient
package object people {
val defaultName = "John Q. Public"
}
package people {
class Person {
var name = defaultName // 从包对象拿到的常置
}
…….
}
- 注意defaultName不需要加限定词,因为它位于同一个包内。在其他地方,这个常量可以用com.horstmann.impatient.people.defaultName访问到。
- 在幕后,包对象被编译成带有静态方法和字段的JVM类,名为package.class,位于相应的包下。对应到本例中,就是com.horstmann.impatient.people.package,其中有一个静态字段defaultName。
- 在JVM中,你可以使用package作为类名。对源文件使用相同的命名规则是好习惯,可以把包对象放到文件com/horstmann/impatient/people/package.scala。这样一来,任何人想要对包增加函数或变量的话,都可以以很容易地找到对应的包对象
11.1.4 包可见性
在Java中,没有被声明为public、private或protected的类成员在包含该类的包中可见。在Scala中,你可以通过修饰符达到同样的效果。以下方法在它自己的包中可见:
package com.horstmann.impatient.people
class Person {
var name:String="";
private[people] def description = "A person with name " + name
//……
}
还可以将可见度延展到上层包:
private[impatient] def description="A person with name "+name
11.2 包的引入(import)
11.2.1 显示引入
scala包的引入和java包的引入是一样的,都是用 import 关键字。
和java不同的是:
- 在Scala中,import语句可以出现在任何地方,并不仅限于文件顶部。import语句的效果一直延伸到包含该语句的块末尾。
如下:
class Manager {
import scala.collection.mutable._
val subordinates = new ArrayBuffer[String]
}
11.2.2 隐式引入
和Java程序一样,java.lang总是被引入。scala包也被引入一些包。
每个Scala程序都隐式地以如下代码开始:
import java.lang._
import scala.
import Predef._
由于scala包默认被引入,对于那些以scala开头的包,你完全不需要写全这个前缀。例如:
collection.mutable.HashMap
上述代码和以下写法效果是一样的:
scala.collection.mutable.HashMap