2016-11-01 10 views
0

私はスカラーを学んでいるので、次のコードを試してみてください。スカラでプライマリコンストラクタを呼び出すときに混乱する

object Demo7 { 
     def main(args: Array[String]): Unit = { 
       class Person(val fullName: String) { 
         println(s"This is the primary constructor. Name is ${fullName}") 
         val initial = fullName.substring(0, 1) // Computed during initialization 

         //def this(firstName: String, lastName: String) = this(s"$firstName $lastName") 

       } 
       new Person("Tek Tuk") 
       new Person("Tek Tuk").fullName 

     } 
} 

次に、それぞれの呼び出しと同じ結果が返されます。 私の理解のために、このライン

new Person("Tek Tuk").fullName 

は、この行が最初の行と同じ結果をコンパイルし、返します、なぜ誰も私を説明することができ、コンパイルされないでしょうか?

ありがとうございます。

+0

質問を完全な文章でお願いしますか? –

+0

なぜ2行目でエラーが発生するはずですか? – fxlae

+0

あなたはどんなエラーが表示されますか?あなたが期待している行動は? – talex

答えて

5

PersonクラスのfullNameフィールドにアクセスする理由がわかっているのは、パラメータリストでvalと宣言しているからです。

これは、Javaでpublic finalフィールドを宣言するのと同じです。そうではない - あなたはそれがプライベートになりたい場合は、単に、両方が「復帰」同じもの呼び出す理由については、すなわち

class Person(fullName: String) { 
    (...) 
} 

val部分を削除します。

  • new Person("Tek Tuk")は、Personのインスタンスを返します。
  • new Person("Tek Tuk").fullName"Tek Tuk" - a Stringです。同じfullNamePersonという別のインスタンスを作成し、fullNameという名前を付けました。

両方、しかし、印刷"This is the primary constructor. Name is Tek Tuk"、あなたはどちらの場合も同じコンストラクタと呼ばれ、あなたは、コンストラクタでこれを印刷しprintlnを持っているので。

+0

ありがとう、私は今それを理解しています。 – kn3l

+1

「これはJavaの公開最終フィールドとして宣言するのと同じです。実際には、パブリックゲッターメソッドを持つプライベートフィールドです。 –

関連する問題