在Java中類成員變量的訪問修飾符可以分為4種:public脉顿,protected效览,private和默認(rèn)残拐。這里默認(rèn)指的是成員變量前面不加任何修飾符愧杯。
通過下面的表格簡單回顧一下這4種修飾符在Java中的區(qū)別
可見性 | public | protected | 默認(rèn) | private |
---|---|---|---|---|
同一個類 | 是 | 是 | 是 | 是 |
同一個包中任何的類 | 是 | 是 | 是 | 否 |
同一個包中的子類 | 是 | 是 | 是 | 否 |
同一個包外的子類 | 是 | 是晾咪,通過繼承 | 否 | 否 |
包外的任何非子類 | 是 | 否 | 否 | 否 |
Scala中類成員變量的訪問修飾符
分為private收擦,protected和默認(rèn)(無任何修飾符)
- protected
在scala中protected比java更加嚴(yán)格,只有子類(無論是否在同一個包中)才可以訪問 - 默認(rèn)
通過編譯scala文件可以知道谍倦,這種情況生成的class文件里面其實這個變量是private類型的塞赂,如果定義為val那么scala會自動生成getter方法,如果定義為var那么會自動生成getter和setter方法昼蛀,而且這些方法都是public的宴猾。所以其實這個變量本身是private的,只是使用了它的getter和setter方法進行訪問叼旋。使用變量的方式和java中public修飾的變量類似仇哆,即對象.變量名
,但本質(zhì)是不同的夫植。 - private
和默認(rèn)修飾符類似的原理讹剔,只是生成的getter或者setter方法為private的,這樣就導(dǎo)致了只有這個類中的方法可以訪問該類的所有對象的這種變量详民,例如
class Person {
private var id = 0
def equals(other: Person): Boolean = {
//other是Person類的一個對象延欠,而且equals在這個類中
//所以other可以訪問id這個變量
//如果在其他類中生成一個Person對象是無法訪問id這個變量的
id == other.id
}
}
- private的擴展-對象私有
scala對私有變量有更加嚴(yán)格的限制方式,即對象私有阐斜。例如上例中衫冻,可以定義id這個變量為private[this] var id = 0
,這樣定義的變化
- 不會再生成setter和getter方法
- 這個變量只能被當(dāng)前對象訪問谒出,而任何類似
對象.id
形式的訪問都不被允許
class Person {
private[this] var id = 0
//只有當(dāng)前對象可以訪問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這個對象已經(jīng)無法再訪問id這個變量了
id == other.id
}
}