2017-08-29 90 views
0

这里是代码和输出:Scala伴侣对象与Vs. Scala的新对象类

//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操作符创建一个类的对象如何一个同伴对象将打印a1(私有变量)值并且还访问A类的A1方法。我的意思是说,我想访问都伴随A类通过同伴对象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 
    } 
} 

上面的代码片段也应该可以正常工作,因为在马尔丁Odersky的书已经写了类及其伴侣对象可以访问对方的私人成员。

+0

首先使用'var'和mutability不是使用Scala最常用的方式 – cchantep

回答

1

因为在马尔丁Odersky的书已经写了一个类和它的同伴对象可以互相访问对方的私有成员

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

我的疑问是,如果我不想使用new操作符创建一个类的对象怎么能一个同伴对象将打印A1(私有变量)的值,也可以访问一个类的方法A1。

那么,你需要使用new地方,因为只有class A实例具有A1()方法和a1领域。

请注意,class Aobject A之间的主要特殊关系是这种特殊的可见性规则(在此阶段学习时其他细节可能与您无关)。所以对于A1()调用它并不重要,你有一个伴侣对象;它可能同样是object B

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

+0

谢谢。 @Alexey您能否让我知道 - 还有哪些其他细节以及我可以在哪里了解更多信息。 –

+1

@PardeepSharma你会了解到他们,当你有牵连。 –

+0

很酷:)谢谢@Alexey –