在scala中调用主构造函数时会混淆

时间:2016-11-01 14:03:11

标签: scala oop

我正在学习scala,我尝试使用以下代码。

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 

不应该编译,任何人都可以解释为什么这行得到编译并返回与第一行相同的结果?

谢谢。

1 个答案:

答案 0 :(得分:5)

如果您问为什么您可以访问fullName课程的Person字段,那是因为您已将其声明为参数列表中的val

这与在Java中声明它为public final字段相同。如果您希望它是私有的,只需删除val部分,即

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

至于为什么两个电话"返回"同样的事情 - 他们不会。

  • new Person("Tek Tuk")返回Person的实例。
  • new Person("Tek Tuk").fullName返回"Tek Tuk" - String。您使用相同的Person创建了另一个fullName实例,并在其上调用了fullName

但是,两者都打印"This is the primary constructor. Name is Tek Tuk",因为在这两种情况下都调用了相同的构造函数,并且您有println在构造函数中打印它。