我想澄清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函数中访问。
答案 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
成员变量。唯一的区别在于生成了哪种访问器。在第一种情况下,没有生成访问者,第二种情况是生成公共访问者,第三种情况是私有访问者。