Scala的参数字段和构造函数参数

时间:2012-06-25 12:18:25

标签: scala

我理解参数字段(如下例中的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这样的方法。)

2 个答案:

答案 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);
}