scala-16Scala中包的定义、包对象、包的引用、包的隐式引用代码实战

时间:2023-01-12 23:09:14

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包内的内容对于这个文件来说是可见的(comcom.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对象的所以东西