快学Scala 第七章 包和引入 课后答案
程序员文章站
2022-06-14 22:10:07
...
1. 编写示例程序,展示为什么
package com.horstmann.impatient 不同于
package com
package horstmann
package impatient
//可以引用父包中的类,和父包的父包中的类
package com{
class Animal(){}
package horstmann{
class Dog(a :Animal){}
package impatient{
class Male(a:Animal,d:Dog){}
}
}
}
//只可以引用同级包中的类
package com.horstmann.impatient{
class Female(m:Male){}
}
2. 编写一段让你的Scala朋友们感到困惑的代码,使用一个不在顶部的com包
//可以引用父包中的类,和父包的父包中的类
package com{
class Animal(){}
package horstmann{
class Dog(a :Animal){}
package impatient{
class Male(a:Animal,d:Dog){}
}
}
}
import com._
class Female(a:Animal)
3. 编写一个包random,加入函数nextInt():Int,nextDouble():Double,setSeed(seed:Int):Unit。生成随机数的算法采用线性同余生成器:
//03
package random{
package object random{
var seed:Int =_
val a=BigDecimal(1664525)
val b = BigDecimal(1013904223)
val n = 32
def nextInt()={
val tmp = (seed * a +b)% math.pow(2,n)
tmp.toInt
}
def nextDouble()={
val tmp = (seed * a +b)% math.pow(2,n)
tmp.toInt.toDouble
}
}
}
4. 在你看来Scala的设计者为什么要提供 package object语法而不是让你将函数和变量添加到包中?
因为jvm虚拟机的局限导致
5. private[com] def giveRaise(rate:Double)的含义是什么?有用吗?
//该方法在com的上层包中可见
6. 编写一段程序将Java哈希映射中的所有元素拷贝到Scala哈希映射,用引入语句重命名这两个类
import java.util.{HashMap => JavaHashMap}
import scala.collection.mutable
object Demo01 {
def main(args: Array[String]): Unit = {
val javaHashMap = new JavaHashMap[String,String]()
val scalaHashMap = new mutable.HashMap[String,String]()
javaHashMap.put("zhangsan","1")
javaHashMap.put("lisi","2")
javaHashMap.put("wangwu","3")
val keys: Array[AnyRef] = javaHashMap.keySet().toArray
for(key <- keys){
scalaHashMap += (key.toString -> javaHashMap.get(key))
}
println(scalaHashMap.mkString(","))
}
}
7. 在前一个练习中,将所有语句移动到尽可能小的作用域里面。
object Demo01 {
def main(args: Array[String]): Unit = {
val javaHashMap = new java.util.HashMap[String,String]()
val scalaHashMap = new collection.mutable.HashMap[String,String]()
javaHashMap.put("zhangsan","1")
javaHashMap.put("lisi","2")
javaHashMap.put("wangwu","3")
val keys: Array[AnyRef] = javaHashMap.keySet().toArray
for(key <- keys){
scalaHashMap += (key.toString -> javaHashMap.get(key))
}
println(scalaHashMap.mkString(","))
}
}
8. 一下的Java代码是什么,这是个好的主意吗?
import java._
import javax._
//这个代码的意思是导入java和javax下面的所有类,而java和javax下面都是包,没有类,所以这个代码是没有用的
9. 编写一段程序,引入java.lang.System类,从user.name系统属性读取用户名,从Console对象读取一个密码,如多密码不是secret.则在标准错误流中打印一个消息;如果密码是“secret”,则在标准的输出流中打印出一个问候消息。不要使用任何其他引入,也不要使用任何限定词(带句点的那种)
def main(args: Array[String]): Unit = {
val password: String = Console.readLine()
if("secret" == password) println("hello" + System.getProperty("user.name")) else System.err.println("secret err!")
}
10. 处理StringBuilder,还有哪些java.lang成员是被scala包覆盖的?
直接比对java.lang下的类和scala包下的类即可