在 Scala 中,包(Package) 是用于组织代码、避免命名冲突的核心机制,类似于 Java 的包,但提供了更灵活的语法和功能。以下从核心概念、定义方式、访问控制、包对象等方面详细讲解:
一、核心概念
- 包本质是命名空间,通过层级结构(如
com.example.util)组织类、对象、特质(Trait)等成员。 - Scala 包支持嵌套定义(包内可以再定义子包),且包名与文件目录结构不强制严格对应(但推荐保持一致,便于维护)。
- 包的命名规范:通常使用小写字母,层级间用
.分隔,推荐以公司 / 组织域名反向命名(如com.alibaba.scala)。
二、包的定义方式
Scala 提供两种主要的包定义语法,推荐使用嵌套语法(更简洁、支持包内成员隔离)。
作用: 区分同名的类; 类很多时,更好地管理类;控制访问范围;
(二)包的基本使用
基本步骤:创建包 → 创建对象(类) → 导入类
示例:
1. 创建包。右键,新建软件包。名称小写。
2. 在包上右键,新建类
3. 在测试文件中引入类,使用。
(三)包的定义格式
定义格式1: package 包名
定义格式2: package 包名 {}
定义格式3: package 包名{ package 包名 }
[注意] 一个惯例是将包命名为与包含 Scala 文件的目录名相同。
包名称应全部为小写 ,只能包含数字,字母,下划线,小圆点。不能使用数字开头,也不要用关键字。
例如:
package demo.class.exec1 // 错误,因为class是关键字
package demo.12a // 错误,数字开头
提示:三个默认导入 import java.lang._ ; import scala._ ; import scala.Predef._
两种包的管理风格:
风格1:将包名与包含scala文件的目录名相同
风格2:嵌套package表示层级关系
object TestPackage {
def main(args: Array[String]): Unit = {
val m1 = new dxj.M()
m1.f2()
}
}
package dxj {
class M extends com.td.teacher.Teacher {
def f2() {}
}
}
package com.td.teacher {
class Teacher() {
def f1(){}
}
}
(四)导入包
import
Scala的导入语法:在Scala中显式导入包使用import关键字。
(1)import 包名 导入这个包下的顶层对象
(2)通配符导入: import 包名._ 导入这个包下所有的类
(3)import 包名.类名 导入这个包下的具体的类
(4)导入相同包的多个类:import java.util.{HashSet, ArrayList }
(5)导入成员重命名。如果在一个类中需要导入不同包中的成员且成员名相同,可以通过导入成员重命名的方式区分不同包中的成员,其语法格式为:import java.util.{ArrayList=>JL} 表示把util包中的ArrayList类重命名为JL。
(6)局部导入:什么时候用,什么时候import。在其作用范围内部都可以使用。
(7)导入成员隐藏类。如果一个包中包含多个类,除包中某一个类之外都需要导入,可以使用导入成员隐藏类的方法,其语法格式为:把包中的A不导入。import 包.{A=>_ , _}