scala包
scala也像java一样有包这个概念,但是功能更加强大
Scala包的三大作用(和Java一样)
- 区分相同名字的类
- 当类很多时,可以很好地管理类
- 控制访问范围
包定义方式
scala中包名和源码所在系统文件目录结构可以不一致,这点与java不一样,但是编译之后的字节码路径会和包名保持一致
这也就意味着scala中一个源文件可以包含多个包
且scala有三种包定义方式
第一种方式与java一致,使用package声明所在包
1
package com.zhanghe.study.study_scala.oop
第二种方式,可以将包拆分成多行
1
2package com.zhanghe.study.study_scala
package oop第三种方式,同一源文件中包含多个包的class、object
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43package com.zhanghe.study.study_scala.oop { // 包com.zhanghe.study.study_scala.oop,块内可以声明package,class,object
package model { // 子包,com.zhanghe.study.study_scala.oop.model
class Dog {
var name: String = _
}
}
package service { // 子包,com.zhanghe.study.study_scala.oop.service
object DogServiceImp {
def main(args: Array[String]): Unit = {
}
}
}
package utils {
object MathUtils {
def percentOf(value: Double,rate: Double) = value * rate / 100
}
package langs {
class CalculationRatioUtils{
def giveRaise(salary: Double,rate: Double){
// MathUtils在父包中定义,所有父包内的内容都在作用域内,可以直接使用
MathUtils.percentOf(salary,rate)
}
}
}
}
}
package com.zhanghe.study.study_scala.testop { // 包com.zhanghe.study.study_scala.testop,块内可以声明package,class,object
class Cow {
var age: Int = _
}
}
在使用第三种方式声明包时,由于作用域是以{}来决定的,所以子包可以直接使用父包的class,而无需引入,如果子包和父包中有相同的class,则采用就近引入(由于在编译成java时会自动的引入import 父包.*的方式)
包对象
在使用第三种方式声明package的时候,在package块内只能声明package、class、object、trait等,却不可以声明变量和方法,这是java中JVM的限制,scala为了解决这个问题,引入了包对象
每一个包都可以有一个包对象
1 | package object people{ |
注意包对象的名称必须与包名称一致,用来对包的功能的补充
包引入
scala中的包引入基本操作与java相似,但是比java更强大
在Scala中,import语句可以出现在任何地方,并不仅限于文件顶部,import语句的作用一直延伸到包含该语句的块末尾
1
2
3// 引入某个确定的类
import scala.beans.BeanProperty
var weight:Double = _Java中如果想要导入包中所有的类,可以通过通配符*,Scala中可以使用 _来作为通配符
1
2
3// 引入整个包下的类及其子包
import scala.io._
StdIn.readInt()如果不想要某个包中全部的类,而是其中的几个类,可以采用选取器
1
2
3import scala.math.{BigDecimal,BigInt}
var dec:BigDecimal = BigDecimal.double2bigDecimal(100.0)
var bint:BigInt = BigInt.int2bigInt(200)如果引入的多个包中含有相同的类,那么可以将冲突的类进行重命名进行区分
1
2
3//可以对引入的类进行重命名 将java.util.HashMap重命名为JavaHashMap
import java.util.{HashMap=>JavaHashMap,_}
var map = new JavaHashMap[String,String]()如果某个冲突的类根本就不会用到,那么这个类可以直接隐藏掉
1
2// 排除掉HashMap类,引入该包下其他的类
import scala.collection.mutable.{HashMap=>_,_}
scala会自动引入java.lang包,scala包以及Predef包