包
使用包的目的:管理大型程序中的名称。
包可以嵌套。同一个包可以定义在多个文件当中,也不需要将源文件的目录和包之间对应起来。
|
packagecom{
packagehorstmann{
packageimpatient{
classEmployee
...
}
}
}
|
java.lang、scala和Predef包总是被引入的。
作用域规则
可访问上层作用域中的名称。
在Scala中包名是相对的。而在Java中包名是绝对的,是从包层级的最顶端开始的。相对的包名可能会带来问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
packagecom{
packagehorstmann{
packageimpatient{
classManager{
// 因为scala包总是被引入,所以下面的collection包实际是指scala.collection
valsubordinates=newcollection.mutable.ArrayBuffer[Employee]
...
}
}
}
}
// 这时如果再有一个包
packagecom{
packagehorstmann{
packagecollection{
...
}
}
}
|
在上面的情况下,由于编译器会尝试从com.horstmann.collection中查找mutable,但实际是找不到的,会使得编译Manager类无法通过。
解决方式之一,是使用绝对包名——以_root_开始:
|
valsubordinates=new_root_.scala.collection.mutable.ArrayBuffer[Employee]
|
另一种方法是使用“串联式包语句”。
串联式包语句
|
packagecom.horstmann.impatient{
// com和com.horstmann的成员在这里是不可见的
packagepeople{
classPerson
...
}
}
|
使用了串联式包语句,由于包的上级层次不可见了,所以也就没有了上面提到的问题了。
文件顶部标记
如果文件中的所有代码都属于同一个包,在文件顶部标记包是更好的做法。
1
2
3
4
5
6
7
8
9
10
11
12
|
packagecom.horstmann.impatient
packagepeople
class
...
// 上面的等同于
packagecom.horstmann.impatient{
packagepeople{
classPerson
...
}
}
|
文件的内容都在com.horstmann.impatient.people包内,但com.horstmann.impatient包内的内容对于这个文件来说是可见的(com和com.horstmann是不可见的)。
包对象
包可以包含类、对象和特质,但不能包含函数或变量的定义,这是JVM的局限。将工具函数或常量添加到包,而不是某个Utils对象,更为合理。(这也是初学时觉得Scala的包引入有些奇怪的原因了。)包对象就是为了解决这个局限。
每个包可以有一个包对象,需要在父包中定义,名称与子包一样。
|
packagecom.horstmann.impatient
packageobjectpeople{
valdefaultName="John Q. Public"
}
packagepeople{
classPerson{
valname=defaultName
}
}
|
在编译实现时,包对象被编译成带有静态方法和字段的JVM类,名为package.class,位于相应的包下。
对源文件使用相同的命名规则是好习惯。将包对象放在com/horstmann/impatient/people/package.scala中,会方便其他人找到。
包可见性
Java内,没有修饰符的类成员默认是包内可见的;而Scala则是“公共可见”的。如果要想让成员在某个包内可见,可以使用类似于对象私有字段的语法来指定: private[package-name]。
|
packagecom.horstmann.impatient.people
classPerson{
private[impatient]defdescription="A person with name "+name
...
}
|
引入
|
importjava.awt.Color // 引入Color
importjava.awt._ // 引入包内所有成员
defhandler(evt:event.ActionEvent){// java.awt.event.ActionEvent
... // 因为引入了java.awt,所以可以省去前面的部分
}
|
import语句可以出现在任何地方,而不是只能在文件顶部。import的效果从开始延伸到语句块的结束。这可以大幅减少名称冲突的可能性。
重命名和隐藏成员
如果想要引入包中的几个成员,可以使用selector(选取器):
|
importjava.awt.{Color,Font}
// 重命名成员
importjava.util.{HashMap=>JavaHashMap}
// 隐藏成员
importjava.util.{HashMap=>_,_}// 引入了util包的所有成员,但是HashMap被隐藏了
|
隐式引入
如上所说,Scala总会引入 java.lang._ 、 scala._ 和 Predef._
java.lang总会被引入,然后引入scala包,scala包将会覆盖java.lang中的内容,最后引入Predef包。这里也能解释,为什么以scala开头的包,在使用时都是省去scala.的。
http://nerd-is.in/2013-08/scala-learning-packages-and-imports/
分享到:
相关推荐
最好的scala 学习课件,最好的scala 学习课件,学习spark必备
IDEA集成scala(csdn)————程序
该压缩包包含scala学习教程的入门到深入,包括入门级,以及scala的设计、编程模式等各种scala学习文档
写scala程序的时候,需要scala架包的支持,引用架包里面的类
快学scala 完整清晰版 大数据spark 主要的编程语言 快学scala 完整清晰版 大数据spark 主要的编程语言
SCALA 学习手册 2016.02
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化 。Scala的Case Class及其内置的模式匹配相当于函数式编程语言中常用的...
sparkscala开发依赖包 ECLIPSE 开发IDE需要的对应依赖包
这个打包文件中包含了《SCALA程序设计-JAVA虚拟机多核编程实战》《Scala编程-中文-完整版》《Scala in Action》三本书,足以让你从scala入门到精通,让我们一起愉快的学习吧。spark,scala醉了醉了。哈哈
scala-actors-2.10 jar包,可以解决 scala-actors-2.10以上版本带来的不兼容问题
scala连接redis哨兵模式 demo 使用scala的redis库(csdn)————程序
项目概述:邮电学院Scala大数据实时处理——基于Lambda架构的Spark源码实践 本项目为邮电学院假期师资培训的成果,主要采用Scala语言开发,围绕Lambda架构构建了一套实时数据流处理系统。项目包含35个文件,其中...
官网提供的scala包,通过配置通过tar命令解压,配置环境变量就ok的
scala学习-project.zip
scala-2.12.8 源码包
scala2.12.1Windows镜像包
scala学习帮助文件,中文+英文 Scala 编程 第一发行版,第六版本 ISBN-10: 0-9815316-1-X ISBN-13: 978-0-9815316-1-8
快学scala的习题和答案,对学习scala有巨大帮助,可以好好学习scala,在学习的过程中可以边看边练习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
快学scala的最新版本,独家一份,学习spark2.0的必备入门书籍,快来下载,绝对高清
Scala2.12.8源码包