1 编写示例程序,展示为什么
package com.horstmann.impatient
不同于
package com
package horstmann
package impatient
package a.b.c {
//串联式包语句
object cat {
//一旦使用串联式语句,父包内容不可见
dog.toString()
fa.toString()
}
}
//同一文件定义多个包时,使用{}包起来,否则易出错
package a.b {
object fa {}
}
// 文件顶部标记法
package a
package b
package c
//等同于package a.b
// package c
object dog {
cat.toString()
fa.toString() //上一级包中的内容可见
}
2 编写一段让你的Scala朋友们感到困惑的代码,使用一个不在顶部的com包
object cat {
//可在任何地方引入,不限于顶部,作用效果作该语句块的末端
import a.b._
fa.toString()
}
package a.b {
object fa {}
}
3 编写一个包random,加入函数nextInt():Int,nextDouble():Double,setSeed(seed:Int):Unit。生成随机数的算法采用线性同余生成器:
后值 = (前值 * a + b)mod 2^n
其中,a = 1664525,b=1013904223,n = 32,前值的初始值为seed
网上的答案基本都是错误的,压根不是同余法
以下是Java中随机数的生成,改成scala太费时就不改了,而且scala生成随机数,底层就是调用Java的Random
包对象中不能使用main/App,定义了也不会执行
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
4 在你看来Scala的设计者为什么要提供package object语法而不是简单的让你将函数和变量添加到包中呢?
因为JVM不支持包中包含函数和变量
放在同一个object中,同时便于管理
5 private[com] def giveRaise(rate:Double)的含义是什么?有用吗?
包的可见性,没有被声明为public/private/protected的类成员在包含该类的包中可见
private[com],将类成员的可见度延展到上层包com,即可以使用giveRaise方法
6 编写一段程序,将Java哈希映射中的所有元素拷贝到Scala哈希映射。用引入语句重命名这两个类。
import java.util.{ HashMap => M1 }
import scala.collection.mutable.{ HashMap => M2 }
val m1 = new M1[String, Integer]
m1.put("a", 1)
m1.put("b", 2)
m1.put("c", 2)
val m2 = new M2[String, Int]
for (key <- m1.keySet().toArray()) {
m2 += (key.toString() -> m1.get(key).toInt)
}
for ((k, v) <- m2) println(k + ":" + v)
7 在前一个练习中,将所有引入语句移动到尽可能小的作用域里
同上
8 以下代码的作用是什么?这是个好主意吗?
import java._
import javax._
导入java与javax包中所有成员,不好,包中内容会冲突,但包下面全为子包
9 编写一段程序,引入java.lang.System类,从user.name系统属性读取用户名,从Console对象读取一个密码,如果密码不是”secret”,则在标准错误流中打印一个消息;如果密码是”secret”,则在标准输出流中打印一个问候消息。不要使用任何其他引入,也不要使用任何限定词(带句点的那种)
//java.lang._默认导入
val password = Console.readLine()
if (password == "secret") println("Hello " + System.getProperty("user.name"))
else println("error")
10 除了StringBuilder,还有哪些java.lang的成员是被scala包覆盖的?
scala中,比如基本数据类型,String
scala有很多语法都是对Java的封装,应该能从专门技术文档下查到,逐个对比,不太现实