2012-11-25 2 views
10

의 클래스의 필드와 매개 변수 사이의 진정한 차이 무엇 :스칼라 :이 두 클래스의 차이점은 무엇 생성자

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

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

이름과 성이 항상 클래스 사람에 필드. 같이? 클래스 Person을 인스턴스화하는 방법을 변경합니다. 맞습니까?

답변

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

두 번째 경우의 차이점은 필드가 생성자의 매개 변수이기도하다는 것입니다. 매개 변수를 val 또는 var으로 선언하면 자동으로 공용 멤버가됩니다. var/val이없고 생성자에서 변수를 사용하지 않으면 멤버가되지 않으며 비공개 멤버가됩니다. 그들에게 case class es를 만들면 첫 번째 경우에는 변수에 대한 적용을 취소 할 수 없습니다.

귀하의 질문에 답변하십시오 :이 경우 귀하가 옳습니다. 단지 값을 설정하는 방법을 변경하십시오.

편집 :

팁 : -print와 컴파일러를 호출하는 경우 당신은 볼 수 스칼라 컴파일러가 생성하는 것,이 또한 REPL 작동합니다.

관련 문제