Scala伴侣对象。 Scala类新对象

时间:2017-08-29 12:12:38

标签: scala object companion-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类的对象,那么 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的书中已经写过一个类及其伴随对象可以访问彼此的私有成员。

1 个答案:

答案 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 Aobject A之间的主要特殊关系是此特殊可见性规则(在此学习阶段,其他详细信息可能与您无关)。因此,对于A1()次调用而言,您拥有伴侣对象并不重要;它同样可以是object B

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