- 支持嵌套,下层可以访问上层作用域中的名称
- 可串联
- 顶部标记
- 包对象
- 包可见性
- 包在任何地方都可以引入,作用域至该语句所在块的末尾
- 重命名引入成员(xx => yy)
- 隐藏方法(xx =>_)
- 自动引入(java.lang._ scala._ Predef._)
支持嵌套,下层可以访问上层作用域中的名称
包可以嵌套,一个包可以定义在多个文件当中,也不需要将源文件和包之间对应起来;
package com.benlai{ class Fruit{ def sell : Unit= { println("all fruit sell out") } } package life{ class Apple { def currentState : Unit = { val f = new Fruit //不需要引入Fruit的包 f.sell } } } }
可串联
串联式包名,上级包的成员不可见
package com{ class Fruit{ def sell : Unit= { println("all fruit sell out") } } }
package com.benlai{ //此处不可见com包成员 class Apple { def currentState : Unit = { import com.Fruit val f = new Fruit //不可见com成员,需要引入Fruit的包 f.sell } } class Banana { ..... } }
顶部标记
代码位于同一个包内,在文件顶部标记包;
package com.benlai package life class Apple { def currentState : Unit = { println("this is an apple") } } class Banana { def currentState : Unit = { println("this is a banana") } }
文件的内容在com.benlai.life包中,com.benlai包中的内容对com.benlai.life均可见;但com包中成员对com.benlai.life不可见
包对象
类似于Java中将一个Util类定义在一个静态类中一样,包对象就是将一些常用的方法写在一个package object中,需要的时候,引入这个包;
package com.benlai.life package object DateUtil { val info = "current date ...." def display():Unit = { println("info is " + info) } }
//在 Fruit对象中调用DateUtil的display方法
class Fruit { def currentInfo():Unit = { import com.benlai.life.DateUtil DateUtil.display() } }
包的可见性
scala中类内的成员默认是公有访问权限的,如果想要把scala的成员设定为私有类型的需添加 private[package-name];如 private[this] val name:String = "jack"
package com.benlai class Person{ val name:String = "jack" //公有访问权限 private[this] val age:Int = 21 //类内成员可访问 private[com] val address:String = "shanghai" //com、com.benlai包下成员可访问 }
包在任何地方都可以引入,作用域至该语句所在块的末尾
{ import package com.benlai.Person //作用域在这个"块"中有效,这个"块"外无效 }
重命名引入成员(xx => yy)和隐藏方法
//重命名引入成员 import java.util.{HashMap=>JHashMap} //引入java.util包下的所有成员除去HashMap外; improt java.util.{HashMap=>_,_}
自动引入
scala会自动引入java.lang._、scala._、Predef._这些包