2012-06-25 63 views
7

我知道參數字段(如下面示例中的x)的行爲與普通字段相同;所以你可以參考它們的方法:Scala的參數字段和構造函數參數

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的方法構造的範圍。)

+0

我相信'x'仍然是如果在至少有一個方法中引用了該成員,則不管它是否帶有'val'前綴。 – adelbertc

回答

9

沒有val關鍵字,你的代碼是類似於:class Test (private[this] val x: Int) { ... }。因此,x可以在全班使用,但不能從外面使用。

它沒有在您的問題中提到,但它也可能是有用的:在case class默認修飾符是val。因此case class Test(x: Int) {...}相當於case class (val x: Int) {...}

+2

當然,減去'case class'所有其他東西。 :-) –

+0

@ DanielC.Sobral其實,我並沒有確切地說,因爲你糾正的錯字不是真正的錯字。 ;) – Nicolas

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