類中字段和參數之間的真正區別是什麼這兩個類之間的區別:斯卡拉:就是在構造函數
class Person {
var name : String = _
var surname: String = _
}
class Person (var name:String, var surname: String)
姓名總是字段類Person。一樣? 我只是改變你實例化Person類的方式。 是嗎?
類中字段和參數之間的真正區別是什麼這兩個類之間的區別:斯卡拉:就是在構造函數
class Person {
var name : String = _
var surname: String = _
}
class Person (var name:String, var surname: String)
姓名總是字段類Person。一樣? 我只是改變你實例化Person類的方式。 是嗎?
我編一類的兩個版本:
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
}
兩者的區別在於,在第二種情況下,這些字段也是構造函數的參數。如果您聲明參數爲val
或var
,則它們將自動成爲公共成員。如果在那裏沒有var
/val
,並且不在構造函數中的任何地方使用變量,則它們將不會成爲成員,如果這樣做,它們將是私有成員。如果你想讓它們變成case class
es,那麼你會在第一種情況下不會不適用這些變量。
所以要回答你的問題:在這種情況下,你是對的,你只是改變你設置值的方式。
編輯:
提示:你可以看到,Scala編譯器生成什麼,如果你調用編譯器-print
,這也適用於在REPL。