包的作用与定义
同java中的包.c++中的命名空间一样,scala中的包主要用于大型工程代码的组织同时也解决命名冲突的问题,scala中的包与java有着诸多的相似之处,但是scala语言中的包更加灵活.
1 |
|
包的作用域与引入(import)的使用方法
1 | package cn{ |
访问控制
在java语言中,主要通过public private protected及默认控制来实现包中类成员的访问控制,当定义一个类时,如果类成员不加任何访问控制符时,表示该成员在定义该类的包中可见.
在scala中没有public关键字,仅有private和protected访问控制符,当一个类成员不加private和protected时,他的访问权限就是public. 下面逐个解释:
- provate成员
private成员同java是一样的,所有带该关键字修饰的成员仅能在定义它的类或对象中使用,在外部是不可见的
1 | class Student(var name:String,var age:Int){ |
2.protected 成员
在java语言中,protected成员不但可以被该类及其子类访问,也可以被同一个包中的其它类使用,但在scala中,protected成员只能被该类及其子类访问
1 | class SuperClass { |
- 无修饰符成员
无修饰符的成员同java的public , 可以在任何位置进行访问
4.范围保护
在scala中提供了更为灵活的访问控制方法,private、protected除了可以直接修饰成员外,还可以以private[X]、protected[X]的方式进行更为灵活的访问控制,这种访问控制的意思是可以将private、protected限定到X,X可以是包、类,还可以是单例对象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
package cn{
class UtilsTest{
//编译通不过,因为Utils利用private[scala]修饰,只能在scala及其子包中使用
//Utils.toString()
}
package scala{
//private[scala]限定Utils只能在scala及子包中使用
private[scala] object Utils{
def toString(x:String){
println(x)
}
import cn.scala.xtwy._
def getTeacher():Teacher=new Teacher("john")
}
package xtwy{
class Teacher(var name:String) {
def printName()={Utils.toString(name)}
}
}
}
}
object appDemo{
import cn.scala._
import cn.scala.xtwy._
def main(args: Array[String]): Unit = {
//编译通不过,同UtilsTest
//Utils.toString(new Teacher("john").name)
new Teacher("john").printName()
}
}
private[this],限定只有该类的对象才能访问,称这种成员为对象私有成员
1 | package cn.scala.xtwy; |
private,定义的类及伴生对象可以访问
1 | package cn.scala.xtwy; |
下面给出的是访问规则表
修饰符 访问范围
无任何修饰符 任何地方都可以使用
private[scala] 在定义的类中可以访问,在scala包及子包中可以访问
private[this] 只能在定义的类中访问,即使伴生对象也不能访问团
private 在定义的的类及伴生对象中可以访问,其它地方不能访问
protected[scala] 在定义的类及子类中可以访问,在scala包及子包中可以访问,
protected[this] 只能在定义的类及子类中访问,即使伴生对象也不能访问
protected 在定义的类及子类中访问,伴生对象可以访问,其它地方不能访问
包对象
包对象主要用于常量,工具函数,使用时直接通过包名引用,