8

我了解参数字段(如下x例所示)的行为类似于普通字段;所以你可以在方法中引用它们:

class Test(val x: Int) { // x is a parametric field
  override def toString = "Test: " + x;
}

但是,如果您删除关键字val,代码仍然可以编译(并且查看和.class输出,x仍然是该类的成员)。所以我想知道,参数字段(即val x: Int上面的)和构造函数参数(x: Int)之间有什么区别?

(在我脑后有 Java 的情况下,我本来希望构造函数的范围包括像这样的方法x。)toString

4

2 回答 2

12

如果没有val关键字,您的代码类似于:class Test (private[this] val x: Int) { ... }. 因此,x在整个班级都可以使用,但不能从外部使用。

您的问题中没有提到它,但它也可能有用:在case class默认修饰符中是val. 因此case class Test(x: Int) {...}等价于case class (val x: Int) {...}

于 2012-06-25T12:27:37.673 回答
4

构造函数参数有效地成为一个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);
}
于 2012-07-06T20:13:25.623 回答