0

这是代码和输出:

//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 类的对象,那么伴随对象如何打印a1(私有变量)值并访问 A 类的 A1 方法。我的意思是说我想通过伴随对象 A 访问 Companion Class 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 的书中已经写到A 类及其伴随对象可以访问彼此的私有成员。

4

1 回答 1

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 Aobject A extends Anew

于 2017-08-29T13:11:24.130 回答