下面的类编译。如果有的话,我怎样才能看到这两个范围之间的区别?
class C1 {
private val p = 0
private[C1] val pClass = 1
def m1(other: C1) {
println(other.p)
println(other.pClass)
}
}
下面的类编译。如果有的话,我怎样才能看到这两个范围之间的区别?
class C1 {
private val p = 0
private[C1] val pClass = 1
def m1(other: C1) {
println(other.p)
println(other.pClass)
}
}
它们几乎是等价的,并且在所有常见用例中绝对是等价的。
但是,实际上两者之间存在非常微小的语义差异:
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
创建:
p
p()
private[C1] val pClass
创建:
C1$$pClass
C1$$pClass()