在Java中类成员变量的访问修饰符可以分为4种:public,protected,private和默认。这里默认指的是成员变量前面不加任何修饰符。
通过下面的表格简单回顾一下这4种修饰符在Java中的区别
可见性 | public | protected | 默认 | private |
---|---|---|---|---|
同一个类 | 是 | 是 | 是 | 是 |
同一个包中任何的类 | 是 | 是 | 是 | 否 |
同一个包中的子类 | 是 | 是 | 是 | 否 |
同一个包外的子类 | 是 | 是,通过继承 | 否 | 否 |
包外的任何非子类 | 是 | 否 | 否 | 否 |
Scala中类成员变量的访问修饰符
分为private,protected和默认(无任何修饰符)
- protected
在scala中protected比java更加严格,只有子类(无论是否在同一个包中)才可以访问 - 默认
通过编译scala文件可以知道,这种情况生成的class文件里面其实这个变量是private类型的,如果定义为val那么scala会自动生成getter方法,如果定义为var那么会自动生成getter和setter方法,而且这些方法都是public的。所以其实这个变量本身是private的,只是使用了它的getter和setter方法进行访问。使用变量的方式和java中public修饰的变量类似,即对象.变量名
,但本质是不同的。 - private
和默认修饰符类似的原理,只是生成的getter或者setter方法为private的,这样就导致了只有这个类中的方法可以访问该类的所有对象的这种变量,例如
class Person {
private var id = 0
def equals(other: Person): Boolean = {
//other是Person类的一个对象,而且equals在这个类中
//所以other可以访问id这个变量
//如果在其他类中生成一个Person对象是无法访问id这个变量的
id == other.id
}
}
- private的扩展-对象私有
scala对私有变量有更加严格的限制方式,即对象私有。例如上例中,可以定义id这个变量为private[this] var id = 0
,这样定义的变化
- 不会再生成setter和getter方法
- 这个变量只能被当前对象访问,而任何类似
对象.id
形式的访问都不被允许
class Person {
private[this] var id = 0
//只有当前对象可以访问id
def generateId = (new util.Random).nextInt(3) + id
def equals(other: Person): Boolean = {
//这行编译会报错:value id is not a member of Person id == other.id
//other这个对象已经无法再访问id这个变量了
id == other.id
}
}