包
使用包的目的:管理大型程序中的名称。
包可以嵌套。同一个包可以定义在多个文件当中,也不需要将源文件的目录和包之间对应起来。
|
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-2.12.10.zip"文件是Scala编程语言的特定版本——2.12.10,专为Windows操作系统设计的安装包。Scala 2.12.x系列是该语言的一个稳定版本,它提供了许多新特性和改进,旨在提高开发人员的效率和代码的可维护...
"快学Scala(黑马老师推荐)"这个压缩包很可能是由知名的教育机构——黑马程序员提供的Scala学习资料,包含了高清的课程内容,旨在帮助学习者快速掌握这门语言。 在Scala中,类和对象是核心概念。类用于定义对象的...
在压缩包文件列表中,有两个不同的Scala版本——2.11.12和2.11.8。这两个版本之间的差异主要在于bug修复、性能提升和新功能的添加。例如,2.11.12是较新的版本,可能包含自2.11.8以来的更多改进。用户可以根据自己的...
"Scala编程完整版.rar"这个压缩包包含了一份详细的Scala学习资料——"Scala编程完整版.pdf",对于想要深入理解和掌握Scala的人来说,这是一个宝贵的资源。 在Scala中,类和对象是核心概念。类定义了对象的状态和...
总之,Scala.js是一个极具创新性的技术,它打破了传统前端开发的边界,让开发者有机会用一种更为强大和灵活的语言——Scala,来构建现代Web应用。随着技术的不断成熟,Scala.js已经成为越来越多开发者的首选工具之一...
这个压缩包“scala-2.12.7.zip”包含了Scala的特定版本——2.12.7,这是一个重要的更新,旨在提供稳定性和性能改进。Scala运行在Java虚拟机(JVM)上,因此它能够利用Java生态系统的广泛资源。 Scala的名字是...
这个过程涉及了Java语言替代品——Scala语言在Android开发中的应用。 Scala是一种静态类型的编程语言,它具有函数式编程和面向对象编程的特点,为开发者提供了更高级的抽象和语法糖,使得代码更加简洁和可读。将...
标题“Scala 2.11.7安装包”指的是这个压缩文件包含了Scala编程语言的特定版本——2.11.7的安装资源。Scala的版本号通常由主要版本号、次要版本号和修订版本号组成,如2.11.x。这里的2.11代表次要版本,而7是修订...
8. **Dotty 和 Scala 3**:Scala 社区正在开发下一代 Scala 版本——Scala 3(以前称为 Dotty),它旨在解决 Scala 2 中的一些复杂性和不一致性,提供更好的互操作性与简化语法。 9. **Scalactic 和 ScalaTest**:...
2. **面向对象编程**:Scala支持传统的类和对象,同时引入了特质(trait),它们可以用来实现多重继承和行为组合。另外,Scala中的一切都是对象,包括函数,这被称为"一切皆对象"的概念。 3. **函数式编程**:Scala...
标题中的"flink-1.7.1-bin-scala_2.12.tgz"指的是Apache Flink的一个特定版本——1.7.1的二进制发行版,它与Scala 2.12版本兼容。Flink是一个开源的流处理和批处理框架,广泛应用于大数据处理领域。这个压缩包包含了...
此外,Scala还引入了Actor模型,这是处理并发和并行计算的一种方式,通过隔离状态和消息传递来避免竞态条件。 在Scala中,你可以使用Akka库来构建分布式、容错的应用系统。Akka是基于Actor模型的,它简化了在多核、...
这个"scala-2.11.8.tar.gz"文件是Scala编程语言的特定版本——2.11.8的归档包,通常用于Linux或类Unix系统。这个版本号表明它是一个更新稳定版,2.11.x系列是Scala的一个长期支持(LTS)分支,意味着它会得到较长...
同时,Scala还引入了case类,为创建不可变数据类型提供了一种简洁的方式,这对于函数式编程尤为重要。 函数式编程在Scala中占据了重要地位。你将学习到如何使用map、filter、reduce等函数对集合进行操作,以及如何...
本次我们关注的是 Flink 的一个特定版本——1.11.0,它包含了 Scala 2.11 的绑定,这意味着开发者可以利用 Scala 这种函数式编程语言来编写 Flink 作业。 Flink 1.11.0 的发布带来了许多增强和改进。首先,它优化了...
文件标题为“Lego-scala-meetingup.pdf”,描述中同样提到该文件名,标签包括“scala”和“lego”。部分内容涉及Scala编程语言与一个名为LEGO的框架或系统。下面将详细解释文件中涉及的核心概念和技术实践。 ### ...
**Sbt资源包详解——全平台版本Sbt-Platform** Sbt(Simple Build Tool)是Scala项目的主要构建工具,它以其高效、灵活和强大的特性深受开发者喜爱。在 Scala 开发环境中,Sbt 起到了核心作用,它负责编译、测试、...
本文探讨的主题——安全的类型级抽象在Scala中的应用,是理解该语言高级特性的关键所在。类型抽象是指在程序设计中,通过定义泛型或参数化类型来实现代码的复用性和灵活性。而类型级抽象则进一步将这种抽象概念应用...
今天,我们将深入探讨一个名为"killbill-api-0.1.68.zip"的开源项目,该项目包含了一个实验性的Scala库——Scala.Rx,它是一种函数式反应式编程(FRP)库。让我们一起揭开这个神秘面纱,了解其背后的技术原理和应用...