2013-08-31 67 views

回答

10

它們幾乎是等價的,在所有常見用例中絕對是等價的。

,實際上兩者之間一個非常微小的語義差別:

  • 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。如果iprivate(不需要覆蓋),並且如果override被刪除,則display將返回1而不是2。所以基本上,除非你有內部類延伸類本身,private[C1]將表現得完全像private


注意也是上面的原因,他們沒有實現在字節碼級相同:

  • private val p創建:
    • 私有字段p
    • 和私人訪問方法p()
  • private[C1] val pClass創建:
    • 私有字段C1$$pClass
    • 公共訪問方法C1$$pClass()
相關問題