Scala构造函数参数修饰符

时间:2012-12-26 22:44:45

标签: scala constructor

我想澄清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打印

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

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

1 个答案:

答案 0 :(得分: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成员变量。唯一的区别在于生成了哪种访问器。在第一种情况下,没有生成访问者,第二种情况是生成公共访问者,第三种情况是私有访问者。