2012-11-25 134 views
10

類中字段和參數之間的真正區別是什麼這兩個類之間的區別:斯卡拉:就是在構造函數

class Person { 
    var name : String = _ 
    var surname: String = _ 
} 

class Person (var name:String, var surname: String) 

姓名總是字段類Person。一樣? 我只是改變你實例化Person類的方式。 是嗎?

回答

6

我編一類的兩個版本:

class PersonV0 { 
    var name : String = _ 
    var surname: String = _ 
} 

class PersonV1 (var name:String, var surname: String) 

不同的是構造函數:

public experimental.PersonV0(); 
    Code: 
    0: aload_0 
    1: invokespecial #23; //Method java/lang/Object."<init>":()V 
    4: return 
} 

public experimental.PersonV1(java.lang.String, java.lang.String); 
    Code: 
    0: aload_0 
    1: aload_1 
    2: putfield #12; //Field name:Ljava/lang/String; 
    5: aload_0 
    6: aload_2 
    7: putfield #16; //Field surname:Ljava/lang/String; 
    10: aload_0 
    11: invokespecial #24; //Method java/lang/Object."<init>":()V 
    14: return 
} 
10

兩者的區別在於,在第二種情況下,這些字段也是構造函數的參數。如果您聲明參數爲valvar,則它們將自動成爲公共成員。如果在那裏沒有var/val,並且不在構造函數中的任何地方使用變量,則它們將不會成爲成員,如果這樣做,它們將是私有成員。如果你想讓它們變成case class es,那麼你會在第一種情況下不會不適用這些變量。

所以要回答你的問題:在這種情況下,你是對的,你只是改變你設置值的方式。

編輯:

提示:你可以看到,Scala編譯器生成什麼,如果你調用編譯器-print,這也適用於在REPL。