2013-05-09 39 views
1

我想了解對象私有變量在Scala中的實現。斯卡拉編譯該類對象私有變量的實現

class Counter{ 
    private[this] var age = 0 
} 

到下面的Java字節碼:

public class Counter implements scala.ScalaObject { 
    private int age; 
    public Counter(); 
} 

但儘管如此,由於JVM不支持對象的私人領域,我們有很好的老私有字段,它可以是從該類的其他實例訪問。所以對於我來說,隱藏私人領域之前的課程和以下課程之間的區別並不清楚。

class Counter2{ 
    private var age = 0 
} 

public class Counter2 implements scala.ScalaObject { 
    private int age; 
    private int age(); 
    private void age_$eq(int); 
    public Counter2(); 
} 
+0

可能重複的[私人\ [this \] vs私人](http://stackoverflow.com/questions/9698677/privatethis-vs-private) – zellus 2013-05-09 07:46:32

+0

你的問題是什麼?顯而易見的區別是,訪問對象專用字段是另一個實例的編譯時錯誤。但我認爲你知道這一點,所以我不確定在這裏問什麼。 – 2013-05-09 09:47:53

+0

我的問題是如何實現,如果JVM不支持對象私有字段 – damluar 2013-05-09 09:50:42

回答

1

JVM是無關緊要的。 Scala的語義是由Scala編譯器實現的,而不是由JVM實現的。畢竟,JVM甚至不是Scala運行的唯一平臺,CLI上有Scala的生產就緒實現,以及ECMAScript上的實驗性實現以及本機實現。

+0

所以Scala編譯器禁止所有訪問對象私有字段,除了那些通過這個訪問?這是對的嗎? – damluar 2013-05-09 13:56:30

+0

值得注意的是,即使是Java編譯器有時也會產生允許訪問私有變量和方法的字節碼。例如,如果內部類在其外部類中訪問私有變量。原因與Scala相同--JVM的數據模型與Scala或最新版本的Java中的數據模型並不完美匹配,所以編譯器會作弊一點。 – 2013-05-09 14:54:01

+0

當然,幾乎所有的JVM最終都會編譯爲本地代碼,它不知道任何有關對象,類,接口,公共,私有,受保護的方法等的任何內容。 – 2013-05-09 15:03:03