Scala中包的定义、包对象、包的引用、包的隐式引用代码实战
内容:
1、Scala中包的定义实战
2、包对象代码实战
3、包引用代码实战
4、包的隐式引用代码实战
包可以嵌套,同一个包可以定义在多个文件当中,也不需要将源文件的目录和包之间对应起来。
作用域规则(可访问上层作用域的名称)
()使用绝对包名——以_root_开始
(2)串联式包语句(上层目录不可见)
package com.horstmann.impatient {
// com和com.horstmann的成员在这里是不可见的
package people {
class Person
...
}
文件顶部标记
如果文件中的所有代码都属于同一个包,在文件顶部标记包是更好的做法。
5
6
7
8
9
10
11
12package com.horstmann.impatient
package people
class
...
// 上面的等同于
package com.horstmann.impatient {
package people {
class Person
...
}
}
文件的内容都在com.horstmann.impatient.people包内,但com.horstmann.impatient包内的内容对于这个文件来说是可见的(com和com.horstmann是不可见的)。
包对象
包可以包含类、对象和特质,但不能包含函数或变量的定义,这是JVM的局限。将工具函数或常量添加到包,而不是某个Utils对象,更为合理。(这也是初学时觉得Scala的包引入有些奇怪的原因了。)包对象就是为了解决这个局限。
package com.horstmann.impatient
package object people {
val defaultName = "John Q. Public"
}
package people {
class Person {
val name = defaultName
}
}
//每个包可以有一个包对象,需要在父包中定义,名称与子包一样。
包可见性
而Scala则是“公共可见”的。如果要想让成员在某个包内可见,可以使用类似于对象私有字段的语法来指定:
private[package-name]
即package-name包中的所有类和对象都可以访问private后面的成员。
引入(import)
importjava.awt._ // 引入包内所有成员
import语句可以出现在任何地方,而不是只能在文件顶部。import的效果从开始延伸到语句块的结束。这可以大幅减少名称冲突的可能性。
重命名和隐藏成员
如果想要引入包中的几个成员,可以使用selector(选取器)
1
2
3
4
5
6
7import java.awt.{Color, Font}
// 重命名成员
import java.util.{HashMap => JavaHashMap}
// 隐藏成员
import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了
在包中可以定义包对象,该包中所有的类都可以直接访问包对象中的成员
Scala的隐式引用:
Import Java.lang._
Import scala._
Import predef._ //predif对象的所以东西