Scala学习七——包和引入

一.本章要点

  • 包也可也可以像内部类那样嵌套
  • 包路径不是绝对路径
  • 包声明链x.y.z并不自动将中间包x和x.y变成可见
  • 位于文件顶部不带花括号的包声明在整个文件范围内有效
  • 包对象可以持有函数和变量
  • 引入语句可以引入包、类和对象
  • 引入语句可以出现在任何位置
  • 引入语句可以重命名和隐藏特定成员
  • java.lang、scala和Predef总是被引入

二.包

  Scala中的包和Java/C++中的包都是一样的,用来管理大型程序中的名称。

  可以用完全限定的名称来防止冲突(scala.collection.immutable和scala.collection.mutable),也可以用引入语句来提供一个更短小的别名。

  要增加条目到包中,可以将其包含在包语句当中(注:源文件目录和包之间并没有强制的关联关系,可以在一个文件中写多个):

package com{
package horstmann{
package{
class Employee{

}}
}
}

三.作用域规则

  Scala的包支持嵌套,可以访问上层作用域中的名称:

 

 

  问题:  

 

    这种情况在Java中不会发生,因为包名是绝对的。但在Scala中包名是相对的(可以使用绝对包名解决,以_root_开始[val s=new _root_.scala.collection.mutable.ArrayBuffer[...]],也可以使用串联式。)

四.串联式包语句

  包语句可以包含一个”串“,或者说路径区段,如:

 

 

五.文件顶部标记法

  文件顶部使用package语句:

package com.horstman.impatient
package people //所有内容属于com.hortman.impatient.people,但com.horstman.impatient包中的内容可见,可以直接引用
class Person
...



//相当于
package com.horstman.impatient{
package people{
class Person
...

}

}

六.包对象

  包可以包含类,对象,特质,但不能包含函数或变量的定义(Java虚拟机的局限)。

  每个包可以有一个包对象,需要在父包中定义它,且名称和子包一样,例:

  

package com.horstman.impatient

package object people{
val defaultName="xxx"
}
package people{
class Person{
var name=defaultName //从包对象拿到常量

}

}

  在同一个包中使用包对象字段不需要加限定词,在其他地方可以用com.horstman.impatient.people.defaultName访问(包对象被编译成带有静态方法和字段的JVM类)。

七.包可见性

  在Scala中可以用private[类名/包名]限制属可见位置(像Java中没有修饰符的类成员在包含该类的包中可见)。

  

package com.people
class Person{
private[Person] def ...//只在该类实例化对象中可见
}

//上层包可见
private[com] def ....

 

八.引入

  通过引入语句使用更短的名称。(import xxx.xxx.xxx,_相当于Java中的通配符)

九.任何地方都可以声明引入

  在Scala中,引入语句可以出现在任何地方,并不仅限于文件顶部(如在块中引入,作用效果一直延升到块末尾)

十.重命名和隐藏方法

  • 可以使用选取器引({})入包中的几个成员(import java.awr.{Color,Font});
  • 选取器允许重命名成员(import jva.util.{HashMap=>javaHashMap});
  • HashMap=>_表示隐藏某个成员而不是重命名,一般用来引入其他成员(import java.util.{HashMap=>_,_})

十一.隐式引入

  每个Scala程序都隐式引入如下:

//和Java一样,java.lang总是被引入
//允许覆盖之前的引入,如scala.StringBuilder会覆盖java.lang.StringBuilder
import java.lang._
import scala._
//Predef包含了很多有用函数,在Scala还没有加入包对象之前就已经存在了
import Predef._

 

 十二.练习

 

 

 

 

posted @ 2019-11-28 17:10  biu嘟  阅读(444)  评论(0编辑  收藏  举报