[b]8.1 編寫示例程序,展示爲什麼
package com.horstmann.impatient
不同於
package com
package horstmann
package impatient[/b]
分別使用package的效果如下
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) //無法找到T1
}
[b]8.2 編寫一段讓你的Scala朋友們感到困惑的代碼,使用一個不在頂部的com包
這樣可以嗎?[/b]
package com {
class T1() {}
package horstmann {
class T2(t: T1) {}
package impatient {
class T3(t1: T1, t2: T2) {}
}
}
}
import com._
class TT(t1:T1){
}
[b]8.3 編寫一個包random,加入函數nextInt():Int,nextDouble():Double,setSeed(seed:Int):Unit。生成隨機數的算法採用線性同餘生成器:
後值 = (前值 * a + b)mod 2^n
其中,a = 1664525,b=1013904223,n = 32,前值的初始值爲seed[/b]
package random{
package object random{
var seed:Int = _
val a = BigDecimal(1664525)
val b = BigDecimal(1013904223)
val n = 32
def nextInt():Int={
val temp = (seed * a + b) % BigDecimal(2).pow(n)
seed = temp.toInt
seed
}
def nextDouble():Double={
val 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.nextDouble())
println(random.nextDouble())
println(random.nextDouble())
println(random.nextDouble())
println(random.nextInt())
println(random.nextInt())
println(random.nextInt())
println(random.nextInt())
}
}
[b]8.4 在你看來Scala的設計者爲什麼要提供package object語法而不是簡單的讓你將函數和變量添加到包中呢?[/b]
JVM不支持。。。
[b]8.5 private[com] def giveRaise(rate:Double)的含義是什麼?有用嗎?[/b]
除了com包可訪問,其他包都不能訪問。
[b]8.6 編寫一段程序,將Java哈希映射中的所有元素拷貝到Scala哈希映射。用引入語句重命名這兩個類。[/b]
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)
}
[b]8.7 在前一個練習中,將所有引入語句移動到儘可能小的作用域裏[/b]
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)
}
[b]8.8 以下代碼的作用是什麼?這是個好主意嗎?
import java._
import javax._[/b]
導入java和javax下的所有類。而java和javax下是沒有類的。所以此代碼無用
[b]8.9 編寫一段程序,引入java.lang.System類,從user.name系統屬性讀取用戶名,從Console對象讀取一個密碼,如果密碼不是"secret",則在標準錯誤流中打印一個消息;如果密碼是"secret",則在標準輸出流中打印一個問候消息。不要使用任何其他引入,也不要使用任何限定詞(帶句點的那種)[/b]
import java.lang.System
object Test extends App{
var password = Console.readLine()
if (password equals "secret") System.out.println("Hello " + System.getProperty("user.name"))
else System.err.println("password error!")
}
[b]8.10 除了StringBuilder,還有哪些java.lang的成員是被scala包覆蓋的?[/b]
直接比對java.lang下的類和scala包下的類即可
[b]Blog Url:[/b][url]http://www.ivanpig.com/blog/?p=472[/url]