第9章 包和引入
9.1 包/作用域
在 Java 和 Scala 中管理项目可以使用包结构,C 和 C# 使用命名空间。
对于 package,有如下几种形式:
1)形式体现:
package com.nick.impatient.people class Person { val name = "Nick" def play(message: String): Unit ={ } }
等同于:
package com.nick.impatient package.people class Person { val name = "Nick" def play(message: String): Unit ={ } }
等同于:
package com.nick.impatient{ // com 和 com.nick 的成员在这里不可见 package people{ class Person { val name = "Nick" def play(message: String): Unit ={ } } } }
尖叫提示:位于文件顶部不带花括号的包声明在整个文件范围内有效。
/* 1、包也可以向内部类那样嵌套,作用域原则:可以直接向上访问。即,子 package 中直接访问父 package 中的内容。(即:作用域) 2、包对象可以持有函数和变量(可以直接在包里面定义函数和变量) 3、引入语句可以引入包、类和对象(import scala)(import scala.collection.mutable.Map.add) 4、源文件的目录和包之间并没有强制的关联关系(包不会体现成文件夹形式,Java会强制关联) 5、可以在同一个 .scala 文件中,声明多个并列的 package 6、包名可以相对也可以绝对,比如,访问 ArrayBuffer 的绝对路径是: _root_.scala.collection.mutable.ArrayBuffer 相对路径可以写成:mutable.ArrayBuffer */
9.2 包对象
包可以包含类、对象和特质 trait,但是不能包含函数和变量的定义,这个是Java 虚拟机的限制。
把工具函数或者常量添加到包而不是某个 Utils 对象,这是更加合理的做法。包对象的出现正是
为了解决这个局限。每个包都可以由一个包对象。你需要在父包中定义它,且名称与子包一样。
package com.nick.impatient package object people1{ val defaultName = "Nick" } package people1{ class people1 { var name = defaultName //从包对象拿到的常量 } }
9.3 包可见性
在 Java 中、没有被声明为 public、private 或 protected 的类成员在包含该类的包可见。在Scala 中,
你可以通过修饰符达到同样的效果。以下方法在它自己的包中可见:
package com.nick.impatient.people class Person1 { private[people] def description = "名字:" + name }
当然,也可以将可见度延展到上层包:
private[impatient] def description = "名字:" + name
9.4 引入
通过 import 进行包的引入,_ 类似于 java 中的 *
9.5 重命名和隐藏方法
1)通过包选取器选择单个类:
import java.awt.{Color, Font} Color.RED Font.BOLD
2)重命名:
如果你想要引入包中的几个成员,可以像这样使用选取器(selector),而且选取得同时,可以
重命名:
//重命名 import java.util.{HashMap => JavaHashMap, List} import scala.collection.mutable._ new JavaHashMap[String, Int] new HashMap[String, Int]
而 HashMap 则对应 scala.collection.mutable.HashMap。
2)隐藏:
选取其 HashMap =>_ 将隐藏某个成员而不是重命名它。这仅在你需要引入其他成员时用:
import java.util.{HashMap => _, _} import scala.collection.mutable._