知识点:

1. Scala、Java、C++的包的目的都是为了管理大型程序中的名称。与对象或类的定义不同,同一个包可以定义在多个文件当中。或者在同一个文件中,为多个包贡献内容。

2. Scala的包和其他作用域一样的支持嵌套,可以访问上层作用域中的名称。Scala会遇到默认引入包中的类和自定义包中的类的冲突问题,Java中不会出现这样的问题,包名总是绝对的,从包层级的最顶端开始,但是在Scala中,包名是相对的,就像内部类的名称一样。任何人都可以在任何时候向任何包添加内容。

3. 串联式包语句 com.horstmann.impatient 这样的包语句限定了可见的成员,文件顶部标记法是在文件顶部使用package语句,这比较适用于文件中所有代码属于同一个包的情况。

4. 包对象,包可以包含类、对象和特质,但不能包含函数或变量的定义,这是Java虚拟机的局限,包对象解决了这个局限。每个包都可以有一个包对象,需要在父包中定义它,且名称与子包一样,包对象被编译成带有静态方法和字段的JVM类,名为package.class,位于相应的包下。

5. 包可见性,在Java中,没有被声明为public、private或protected的类成员在包含该类的包中可见,在Scala中,可以通过修饰符达到同样的效果。

pacage com.horstmann.impatient.people

private[people] ….(自己的包中可见)

private[impatient]….(上层包,将可见性扩展到上层包)

6. 引入语句可以使用更短的名称而不是原来较长的名称,引入某个包的全部成员,使用类似于import java.awt._, 这和Java中的通配符*一样,在Scala中,*是合法的标识符。在Scala中,任何地方都可以声明引入,import语句效果一直延伸到包含该语句的块末尾。通过将引入放置在需要这些引入的地方可以大幅减少可能的名称冲突。

如果想要引入包中的几个成员,可以使用选取器,eg: import java.awt.{Color,Font}

选取器语法还允许重命名选到的成员,eg:

      import java.util.{HashMap => JavaHashMap}

      import scala.collection.mutable._

JavaHashMap就是java.util.HashMap,而HashMap则对应scala.collection.mutable.HashMap.

7.隐式引入,每个Scala程序都隐式地以如下代码开始:

import java.lang._

import scala._

import Predef._

这个引入被允许覆盖。

 

练习:参考网址

1.编写示例程序,展示为什么
package com.horstmann.impatient 
不同于
package com 
package horstmann 
package impatient

第一种方式子类不可以使用父包里的类.

package com{
class T1(){}
package horstmann{
class T2(t:T1){}
package impatient{
class T3(t1:T1,t2:T2){}
}
}
} package com.horstmann.impatient{
class T4(t1:T1,t3:T3){}//not found:type T1
}

2.编写一段让你的Scala朋友们感到困惑的代码,使用一个不在顶部的com包

不懂.

3.编写一个包random,加入函数nextInt():Int,nextDouble():Double,setSeed(seed:Int):Unit。生成随机数的算法采用线性同余生成器: 
后值 = (前值 * a + b)mod 2^n 
其中,a = 1664525,b=1013904223,n = 32,前值的初始值为seed

package random{
package object random{
var seed:Int = _
val a = BigDecimal(1664525)
val b = BigDecimal(1013904223)
val n = 32 def nextInt:Int={
var temp = (seed * a + b) % BigDecimal(2).pow(n)
seed = temp.toInt
seed
}
def nextDouble:Double={
var temp = (seed * a + b) % BigDecimal(2).pow(n)
seed = temp.toInt
temp.toDouble
}
}
} package test{
import random.random
object Test extends App{
random.seed = 4
println(random.nextInt)
println(random.nextInt)
println(random.nextInt)
println(random.nextDouble)
println(random.nextDouble)
println(random.nextDouble)
}
}

4.在你看来Scala的设计者为什么要提供package object语法而不是简单的让你将函数和变量添加到包中呢?

虚拟机的局限

5.private[com] def giveRaise(rate:Double)的含义是什么?有用吗?

private[com]定义包可见性,除了com包其他包都不能访问。

6.编写一段程序,将Java哈希映射中的所有元素拷贝到Scala哈希映射。用引入语句重命名这两个类.

import java.util.{HashMap => JavaHashMap}
import scala.collection.mutable.HashMap object Test extends App{
val map = new JavaHashMap[String,String]()
map.put("1", "a")
map.put("2", "b")
map.put("3", "c") val smap = new HashMap[String,String]()
for(key <- map.keySet().toArray){
smap += (key.toString() -> map.get(key))
} println(smap.mkString)
}

7.在前一个练习中,将所有引入语句移动到尽可能小的作用域里.

object Test extends App{
import java.util.{HashMap => JavaHashMap}
val map = new JavaHashMap[String,String]()
map.put("1", "a")
map.put("2", "b")
map.put("3", "c") import scala.collection.mutable.HashMap
val smap = new HashMap[String,String]()
for(key <- map.keySet().toArray){
smap += (key.toString() -> map.get(key))
} println(smap.mkString)
}

8.以下代码的作用是什么?这是个好主意吗?

import java._ 
import javax._

导入Java和javax中的所有类,这两个包中中只有子包,不包含类,所以无用。

9.编写一段程序,引入java.lang.System类,从user.name系统属性读取用户名,从Console对象读取一个密码,如果密码不是"secret",则在标准错误流中打印一个消息;如果密码是"secret",则在标准输出流中打印一个问候消息。不要使用任何其他引入,也不要使用任何限定词(带句点的那种).

import java.lang.System

object Test extends App{
val password = Console.readInt if(password equals "secret")
System.out.println("Hello " + System.getProperty("user.name"))
else System.err.println("password error")
}

快学scala-第七章 包和引入的更多相关文章

  1. 《快学Scala》第六章 对象 第七章 包和引入

  2. 快学Scala 第6章 对象 - 练习

    1. 编写一个Conversions对象,加入inchesToCentimeters.gallonsToLiters和milesToKilometers方法. object Conversions { ...

  3. 《快学Scala》第二章 控制结构和函数

  4. 《快学Scala》第一章 基础

  5. 快学Scala 第七课 (类构造函数)

    类 主构造器: class Person (var name: String){ } 主构造参数可以不带val或者var,如果没有被其他方法使用,则不保存为字段. 如果被其他方法使用,则被升格为字段, ...

  6. 快学Scala习题解答—第一章 基础

    1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...

  7. 《快学Scala》

    Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...

  8. 快学Scala 第十九课 (trait的abstract override使用)

    trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...

  9. [Scala] 快学Scala A1L1

    基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...

随机推荐

  1. 一些牛人分享的ios技巧,保留着

    摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...

  2. Notepad++ V6.9.0 中文绿色便携版

    软件名称: Notepad++软件语言: 简体中文授权方式: 免费软件运行环境: Win 32位/64位软件大小: 3.4MB图片预览: 软件简介:Notepad中文版是一款非常有特色的编辑器,是开源 ...

  3. 安装jar包到本地maven仓库

    1.打开cmd 直接输入一下命令 自己下载的jar包放在d盘根目录下,jar名字叫spring-context-support-3.1.0.RELEASE.jar DgroupId后面写的是group ...

  4. 虚拟机装的XP,无法上网,因为没有安装网卡驱动,怎么解决

    本帖可以解决2个问题: 问题1. 虚拟机装的XP,无法上网,因为没有安装网卡驱动,怎么解决 问题2. 怎么往Oracle VM VirtualBox里传输文件??????? 步骤: 一.在虚拟机的左上 ...

  5. List泛型集合常用方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace List ...

  6. Struts2透过自定义拦截器实现登录之后跳转到原页面

    Struts2通过自定义拦截器实现登录之后跳转到原页面 这个功能对用户体验来说是非常重要的.实现起来其实很简单. 拦截器的代码如下: package go.derek.advice; import g ...

  7. redis持久化探究

    redis支持两种持久化方式,一种是RDB方式,另一种是AOF方式.redis3.0windows版本默认关闭AOF(appendonly no),而开启RDB,当达到一定条件时,redis就会将内存 ...

  8. DateUtils时间工具类探究

    首先声明一下,这个DateUtils工具类不是自己写的,而是在commons-lang-2.Xjar包或是commons-lang3-3.X.jar包中,具体在哪个jar包中,看程序具体添加了哪个版本 ...

  9. Android Studio 项目结构

    在Android Studio中创建项目后,会出现 activity_main.xml 和 MainActivity.java 两个文件 其中  Java文件定义了一个Activity,当应用运行时, ...

  10. Web开发人员不要错过的60款用户界面设计工具(下)

    41. Snipplr 包含最新的脚本和jQuery技术资源库. 42. Midori Midori是一个超轻量级的JavaScript框架,可使用CSS选择器快速访问页面上对应的元素. 43. ro ...