2012-11-25 5 views

答えて

6

は、私はクラスの両方のバージョンをコンパイルした:

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 
} 

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

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

違いはコンストラクタです

10

2つの違いは、2番目のケースでは、フィールドもコンストラクタのパラメータであることです。パラメータをvalまたはvarのいずれかに宣言すると、自動的にパブリックメンバーになります。 var/valがなく、コンストラクタ内の変数をどこでも使用しなければ、メンバーにはなりません。そうした場合、メンバーはプライベートメンバーになります。 case classを作成する場合、最初のケースでは変数の適用を解除しません。

あなたの質問に答えてください:この場合、あなたは正しいです、値を設定する方法を変更するだけです。

編集:

ヒント:あなたは-printでコンパイラを呼び出した場合、これはまた、REPLのために働く、Scalaのコンパイラが生成するものを、見ることができます。

関連する問題