2017-08-29 140 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 –