本章自我总结
本章主要讲述的是引包的一些问题,相比于Java,Scala多出了一些引包方式。
1.嵌套引包,注意作用域,可以访问上层作用域中的名称
2.包对象的加入,可以在包中声明变量和方法,在同包中可以直接调用
原理在韩顺平大神的视频中有提到,是因为包对象在编译时会产生两个类(Scala语言万物皆是类),同包调用实际上调用静态产生静态对象的变量和方法。
3.任何地方都可以引入包,可以重命名包
课后习题解答
1.参见上第1条,可访问的上层作用域不同。
子包里的类可以使用父包里的类
2. 没看懂,什么叫让朋友们感到困惑额
3.
package object random{
var seed:Int=_
val a=BigDecimal(1664525)
val b=BigDecimal(1013904223)
val n:Int=32
def nextInt():Int={
val tp=(seed*a+b)%BigDecimal(2).pow(n)
seed=tp.toInt
seed
}
def nextDouble():Double={
val tp=(seed*a+b)%BigDecimal(2).pow(n)
seed=tp.toInt
tp.toDouble
}
def setSeed(seed:Int)={
this.seed=seed
}
}
package random{
object test{
def main(args: Array[String]): Unit = {
setSeed(4)
for(i<- 1 to 10){
println(nextDouble())
}
}
}
}
java虚拟机的局限性,包中不能使用函数和变量
5.
该方法在com包中可见
6.
import java.util.{HashMap=>JavaHashMap}
import scala.collection.mutable.HashMap
val jmap=new JavaHashMap[Int,String]()
jmap.put(1,"a")
jmap.put(2,"b")
jmap.put(3,"c")
var smap=HashMap[Int,String]()
for(k<-jmap.keySet().toArray()){
smap+=(k.## ->jmap.get(k))
}
for((k,v)<-smap) println(k+":"+v)
略,就是将上面的引包换个位置,换到需要的语句之上,因为相比于java,scala任何地方都可以引包
8.
作用是引入java和javax下所有的包,不是一个好主意,引入太多包会导致编写代码时重复命名现象严重