它們幾乎是等價的,在所有常見用例中絕對是等價的。
但,實際上兩者之間一個非常微小的語義差別:
private
限制訪問外圍類C1
及其配套對象,而是定義不是由子類和繼承不能覆蓋父類中的定義。
private[C1]
也限制訪問C1
及其同伴的對象,但該成員是繼承,並且可以通過一個子類被覆蓋,只要該類有權訪問它(如果它是由封入C1
)。
下面是一個例子:
class A {
private[A] val i = 1
def display() { println(i) }
class B extends A {
override private[A] val i = 2
}
}
val a = new A
a.display // 1
val b = new a.B
b.display // 2 !!
B
可以重寫i
因爲它可以訪問它,並且它可以訪問它,因爲它是一個內部類的A
。如果i
爲private
(不需要覆蓋),並且如果override
被刪除,則display
將返回1
而不是2
。所以基本上,除非你有內部類延伸類本身,private[C1]
將表現得完全像private
。
注意也是上面的原因,他們沒有實現在字節碼級相同:
private val p
創建:
- 但
private[C1] val pClass
創建:
- 私有字段
C1$$pClass
- 和公共訪問方法
C1$$pClass()