2013-05-09 38 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