我理解参数字段(如下例中的x
)表现得像普通字段;所以你可以用方法来引用它们:
class Test(val x: Int) { // x is a parametric field
override def toString = "Test: " + x;
}
但是,如果删除关键字val
,代码仍会编译(并查看.class
输出,x
仍然是该类的成员)。所以我想知道,参数字段(即上面的val x: Int
)和构造函数参数(x: Int
)之间有什么区别?
(在我的脑海中,我希望像x
到而不是这样的构造函数的范围包括像toString
这样的方法。)
答案 0 :(得分:10)
如果没有val
关键字,您的代码类似于:class Test (private[this] val x: Int) { ... }
。因此,x
可用于整个班级,但不能从外部使用。
在您的问题中没有提到它,但它也可能有用:在case class
中,默认修饰符为val
。因此case class Test(x: Int) {...}
相当于case class (val x: Int) {...}
。
答案 1 :(得分:2)
构造函数参数实际上变为private[this]
字段,但仅在至少一个方法中引用。否则,类中不会生成字段。
例如:
class Foo(i: Int) {
println(i)
}
变为
$ javap -private Foo
Compiled from "Foo.scala"
public class Foo extends java.lang.Object implements scala.ScalaObject{
public Foo(int);
}
但是
class Bar(i: Int) {
def baz = println(i)
}
变为
$ javap -private Bar
Compiled from "Bar.scala"
public class Bar extends java.lang.Object implements scala.ScalaObject{
private final int i;
public void baz();
public Bar(int);
}