これら2つのクラスの違いは何ですか:
class Person {
var name : String = _
var surname: String = _
}
class Person (var name:String, var surname: String)
name と surname は常に Class Person のフィールドです。同様に?クラス Person をインスタンス化する方法を変更しただけです。そうですか?
これら2つのクラスの違いは何ですか:
class Person {
var name : String = _
var surname: String = _
}
class Person (var name:String, var surname: String)
name と surname は常に Class Person のフィールドです。同様に?クラス Person をインスタンス化する方法を変更しただけです。そうですか?
2 つの違いは、2 番目のケースではフィールドがコンストラクターのパラメーターでもあることです。パラメータを または のいずれかに宣言するとval
、var
それらは自動的にパブリック メンバーになります。var
/ thereがなくval
、コンストラクター以外の場所で変数を使用しない場合、変数はメンバーにはなりません。使用した場合、それらはプライベート メンバーになります。それらをcase class
es にすると、最初のケースでは変数に unapply がなくなります。
あなたの質問に答えるには:この場合、あなたは正しいです。値を設定する方法を変更するだけです。
編集:
ヒント: scala コンパイラーが生成するものを見ることができます。コンパイラーを で呼び出すと-print
、これは REPL でも機能します。
クラスの両方のバージョンをコンパイルしました:
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
}