Scala 对象私有变量的实现

Scala 对象私有变量的实现,scala,Scala,我试图理解Scala中对象私有变量的实现。Scala编译这个类 class Counter{ private[this] var age = 0 } 转换为以下java字节码: public class Counter implements scala.ScalaObject { private int age; public Counter(); } 但是,由于JVM不支持对象私有字段,我们有很好的旧私有字段,可以从类的其他实例访问。所以对于我来说,上一个类和下一个类在隐藏

我试图理解Scala中对象私有变量的实现。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();
}

JVM是不相关的。Scala的语义是由Scala编译器实现的,而不是JVM。毕竟,JVM甚至不是Scala运行的唯一平台,在CLI上有Scala的可生产性实现,在ECMAScript上有实验性实现,也有本机实现。

JVM与此无关。Scala的语义是由Scala编译器实现的,而不是JVM。毕竟,JVM甚至不是Scala运行的唯一平台,在CLI上有Scala的生产性实现,在ECMAScript上有实验性实现,也有本机实现。

可能重复您的问题是什么?明显的区别是,另一个实例访问对象私有字段是一个编译时错误。但我想你知道这一点,所以我不确定这里问的是什么。我的问题是,如果JVM不支持对象私有字段,那么它是如何实现的?明显的区别是,另一个实例访问对象私有字段是一个编译时错误。我的问题是,如果JVM不支持对象私有字段,那么Scala编译器会禁止所有对对象私有字段的访问,除了通过此字段访问的字段之外?是否正确?值得注意的是,即使是Java编译器有时也会生成允许访问私有变量和方法的字节码。例如,如果内部类访问其外部类中的私有变量。原因与Scala相同——JVM的数据模型与Scala或最新版本的Java中的数据模型都不完全匹配,因此编译器有一点作弊。当然,几乎所有JVM最终都编译为本机代码,而本机代码对对象、类、接口、公共、私有、受保护的方法一无所知,所以Scala编译器禁止所有对对象私有字段的访问,除了那些通过它访问的字段?是否正确?值得注意的是,即使是Java编译器有时也会生成允许访问私有变量和方法的字节码。例如,如果内部类访问其外部类中的私有变量。原因与Scala相同——JVM的数据模型与Scala或最新版本的Java中的数据模型都不完全匹配,因此编译器有一点作弊。当然,几乎所有JVM最终都编译为本机代码,而本机代码对对象、类、接口、公共、私有、受保护的方法一无所知,等