这是代码和输出:
//A scala class with a private variable and one method
class A {
private var a1 = "Zoom"
def A1(): Unit = {
println("A1 Class")
}
}
//A companion object
object A {
def A2(): Unit = {
println("A1 Obj")
val objA = new A
objA.A1()
println("a1 -> "+ objA.a1)
}
}
Output
======
A1 Obj
A1 Class
a1 -> Zoom
现在我怀疑的是,如果我不想使用new运算符来创建A类的对象,那么 A 伴侣对象将如何打印a1(私有变量)值并且还可以访问A1方法一类。我的意思是说我想通过伴侣对象A访问Companion A类的成员。
//A companion object
object A {
def A2(): Unit = {
println("A1 Obj")
A.A1() //It should print A1 Class
println("a1 -> "+ A.a1) //It should print Zoom
}
}
上面的代码片段也应该可以正常工作,因为在Mardin Odersky的书中已经写过一个类及其伴随对象可以访问彼此的私有成员。
答案 0 :(得分:1)
因为在Mardin Odersky的书中已经写过A类及其伴侣对象可以访问彼此的私人成员
这只是意味着您可以在objA.a1
的第一个代码段中访问object A
,即使它不在class A
内(同样,如果您有任何内容) object A
中的私人成员,您可以从class A
访问它们。它根本与第二个片段无关。
现在我怀疑的是,如果我不想使用new运算符来创建A类的对象,那么伴侣对象将如何打印a1(私有变量)值并且还可以访问A类的A1方法。
嗯,您需要在某处使用new
,因为只有class A
的实例具有A1()
方法和a1
字段。
请注意,class A
和object A
之间的主要特殊关系是此特殊可见性规则(在此学习阶段,其他详细信息可能与您无关)。因此,对于A1()
次调用而言,您拥有伴侣对象并不重要;它同样可以是object B
。
您可以通过编写object A
使class A
成为object A extends A
的实例,但这只会隐藏编译器生成的代码中的new
调用。