打包
两种打包方式
方式一
package com {
package horstmann {
package collection {
object BizarroMath
{
def bizplus(a : Int, b : Int) = { a - b }
def bizminus(a : Int, b : Int) = { a + b }
def bizmultiply(a : Int, b : Int) = { a / b }
def bizdivide(a : Int, b : Int) = { a * b }
//private[patient2] def bizexp(a : Int, b: Int) = 0
}
}
}
}
方式二(串联式包语句)
package com.horstmann.collection {
object BizarroMath{
def bizplus(a : Int, b : Int) = { a - b }
def bizminus(a : Int, b : Int) = { a + b }
def bizmultiply(a : Int, b : Int) = { a / b }
def bizdivide(a : Int, b : Int) = { a * b }
//private[patient2] def bizexp(a : Int, b: Int) = 0
}
}
导入
// method1: 导入包, 但是调用还要带包名最后后缀collection
import com.horstmann.collection
collection.BizarroMath.bizplus(1, 2)
// method2: 导入包下的所有代码, 此时不需要带collection
import com.horstmann.collection._
BizarroMath.bizplut(1, 2)
// method3: 连带包中的object对象也一起导入, 调用方法可以不加BizarroMath前缀
import com.horstmann.collection.BizarroMath._
bizplut(1, 2)
导入包操作可以在任何地方, 并不限于在文件顶部, import
语句的效果一直延伸到包含该语句的代码块的结尾.
导入包时,还可以对包进行重命名和隐藏
import java.awt.{Color, Font} // 只引入包中指定成员
import java.util.{HashMap => JavaHashMap} // 重命名java.util.HashMap为JavaHashMap
import scala.collection.mutable._ // 这里也有HashMap, 可以实现:HashMap就只指向scala.collection.mutable.HashMap, 因为java.util.HashMap被重命名为了JavaHashMap, 或者绝对名称调用HashMap, 这样两个HashMap也不会搞混
import java.util.{HashMap => _, _} // HashMap => _ 不是重命名,而是隐藏它
import scala.collection.mutable._ // 这样也可以实现:HashMap就只指向scala.collection.mutable.HashMap, 因为java.util.HashMap被隐藏了
包访问权限
Java有四个级别的访问:public
, (空白)包级别, protected
, private
. Scala有四种:
-
public
: 公有 - 空白: 相当于
public
-
protected
: 子类可访问, 同包不可访问 -
private
: 同类型的对象是可以相互访问对方的private
修饰的字段 -
private[名称]
: 名称可放包名,类名,本对象(this
)。private[_root_]
与public
等效
包对象
包可以包含类、对象和特质,但是不能包含函数和变量定义,当然可以直接在包里定义一个object对象,然后通过packageName.objectName.funcName
调用函数,或通过packageName.objectName.VarName
调用变量。
上述操作虽然达到了目的,但是还是不够直接,如果想直接通过packageName.funcName
调用函数,和通过packageName.VarName
调用变量可不可以呢?答案是可以的。可以通过定义一个包对象来实现。
每个包可以有一个包对象,需要在父包中定义,名称与子包一样
package com.horstmann.impatient
package people {
class Person {
val name = defaultName
}
}
// 定义包对象, 名字和子包people相同, 同时加上package修饰符
package object people {
val defaultName = "John Q. Public" // 除了包内可以访问. 导入包后, 也可以访问
}
// 直接包名调用defaultName
com.horstmann.impatient.people.defauleName // John Q. Public
import com.horstmann.impatient.people._
defaultName // John Q. Public
上面定义的包对象package object people
其实相当于在com.horstmann.impatient.people
中定义了一个package
类, 会在与Person.class
同目录下生成package.class
文件。这个文件里的内容就是package object people
里的代码编译的结果。调用com.horstmann.impatient.people.defaultName
就类似于隐性调用"com.horstmann.impatient.people.package.defaultName"