Scala 伴侣对象与。 Scala Class 新对象

Scala A companion Object Vs. Scala Class new Object

这是代码和输出:

//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 的对象 class,A 伴生对象如何打印 a1(私有变量) 值并访问 A class 的 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 class 及其伴随对象可以访问彼此的私有成员。

because in Mardin Odersky's book it has been written that A class and its companion object can access each other’s private members

这只是意味着您可以访问 object A 的第一个片段中的 objA.a1,即使它不在 class A 中(同样,如果您有任何object A 中的私有成员,您可以从 class A 访问它们)。它与第二个片段完全无关。

Now my doubt is if I don't wanna use new operator to create an Object of A class how can A companion object will print a1(private variable) value and also access the A1 method of A class.

嗯,你需要在某个地方使用 new ,因为只有 class A 的实例有 A1() 方法和 a1字段。

注意class Aobject A之间的主要特殊关系就是这个特殊的可见性规则(其他细节可能与你现阶段的学习无关)。所以对于 A1() 调用来说,你有一个伴随对象根本不重要;它同样可以是 object B.

您可以通过编写 object A extends A 使 object A 成为 class A 的实例,但这只会隐藏编译器生成的代码中的 new 调用。