4

我想澄清scala中的一些概念

class Test(a:Int) {
 def print = println(a)
}

class Test1(val a:Int) {
 def print = println(a)
}

class Test2(private val a:Int) {
 def print = println(a)
}

val test = new Test(1)
val test1 = new Test1(1)
val test2 = new Test2(1)

现在,当我尝试访问一个 in test、test1、test2 时。

斯卡拉打印

scala> test.a
<console>:11: error: value a is not a member of Test

scala> test1.a
res5: Int = 1

scala> test2.a
<console>:10: error: value a cannot be accessed in Test2

我了解整数 a 是 Test1 和 Test2 的一个字段。但是 Integer a 和类 Test 是什么关系呢?显然 Integer a 不是 Test 类的字段,但它可以在 print 函数中访问。

4

1 回答 1

6

查看发生了什么的最好方法是反编译生成的 Java 类。他们来了:

public class Test
{
  private final int a;

  public void print()
  {
    Predef..MODULE$.println(BoxesRunTime.boxToInteger(this.a));
  }

  public Test(int a)
  {
  }
}

public class Test1
{
  private final int a;

  public int a()
  {
    return this.a; } 
  public void print() { Predef..MODULE$.println(BoxesRunTime.boxToInteger(a())); }


  public Test1(int a)
  {
  }
}

public class Test2
{
  private final int a;

  private int a()
  {
    return this.a; } 
  public void print() { Predef..MODULE$.println(BoxesRunTime.boxToInteger(a())); }


  public Test2(int a)
  {
  }
}

如您所见,在每种情况下a都成为private final int成员变量。唯一的区别在于生成了什么样的访问器。在第一种情况下,不生成访问器,在第二种情况下,生成公共访问器,在第三种情况下,它是私有的。

于 2012-12-26T23:44:40.240 回答