scala包的特点
1、scala中的包名和源码所在的文件目录结构可以不一致,但是编译后的字节码文件的路径和包名会保持一致(这个工作由编译器完成)
编译后会生成包对应的目录
2、在scala中 java.lang包
、scala包
、predef包
自动导入
在 IDEA中查看包下内容,快捷键
ctrl + b
3、scala在打包时可以有如下形式
说明
// package top.mgy 表示创建了一个top.mgy的包,在{}中
// 还可以继续写它的子包,scala,包中可以写 类,对象,特质
// 即 scala支持在一个文件中,可以同时创建多个包,以及给各个包创建 类 对象 特质
package top.mgy{ //top.mgy包
package scala{ //top.mgy.scala包
class Person{//表示在 top.mgy.scala 包下创建了一个 class Person
val name = "Nick"
def play(msg:String):Unit={
println(this.name+""+message)
}
}
object Test{//表示在 top.mgy.scala包下创建了一个 object Test
def main(args:Array[String]):Unit={
println("ok")
}
}
}
}
4、作用域原则
可以直接向上访问,即scala中子包可以直接访问父包中的内容大括号体现作用域。
但如果父包中与子包中有相同的类,那么遵循就近原则,则优先使用子包中的同名类,如果非要使用父包中的同名类,则写全路径名称。
5、父包中使用子包的类等则需要导包
6、包发生冲突时使用_root_
绝对路径导入包 _root_
表示从根路径查找该包
包对象
在java中包内只能创建类 而不能创建方法与变量,scala为了弥补这一不足,引入了包对象的概念,即可以在包中不仅可以创建类 ,特质,对象,还以创建方法,变量。
每个包只能有一个包对象,且包对象必须与包同级,包对象的名称必须与包名一致
//包对象 在该包对象中可以定义变量,方法,并且在同名的
package object scala{
var aaa = "abc"
}
package scala{
class Test{
def test():Unit={
//可以在对应的包中直接使用包对象中定义的方法和变量
println(aaa)
}
}
}
在底层scala会为包对象创建两个
package.class
与package$.class
的class文件,使用时,直接调用 package . M O D U L E .MODULE .MODULE.aaa()方法
包访问权限
在scala中新增一个包访问权限
//表示,被 private修饰的 字段,对 visit 包及其子包可见,相当于扩大了该字段的访问权限
private [visit] val name = "jack"
scala的引包说明
1、在scala中 import
可以出现在任何地方
2、import scala.beans._
表示将 sclal.beans
包下所有内容都导入
3、在scala中可以使用选择器进行精准导包
//表示只导入该包下的 HashMap 与 HashSet
import scala.collection.mutable.{HashMap,HashSet}
4、在scala中可以对导入的类进行重命名
//表示对 java.util下的HashMap这个类重命名为 JavaHashMap
import java.util.{HashMap=>JavaHashMap}
5、在scala中可将引入的包中某些内容屏蔽掉
//表示 将 java.util包中所有类导入,但不隐藏掉HashMap
//第一个 _ 表示隐藏 HashMap 第二个 _ 表示导入所有
import java.util.{HashMap =>_, _}