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

kn3*_*n3l 0 oop scala

我正在学习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 

        }
}
Run Code Online (Sandbox Code Playgroud)

然后我运行我得到与每次调用相同的返回结果.我理解这一行

new Person("Tek Tuk").fullName 
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Zol*_*tán 5

如果你问为什么你被允许访问fullName你的Person类的字段,那是因为你已经val在参数列表中声明它.

这与public final在Java中声明它是一个字段相同.如果你想要它是私人的,只需删除val部分,即

class Person(fullName: String) {
  (...)
}
Run Code Online (Sandbox Code Playgroud)

至于为什么两个叫"返回"同样的事情 - 他们没有.

  • new Person("Tek Tuk")返回一个实例Person.
  • new Person("Tek Tuk").fullName返回"Tek Tuk"- a String.您创建了另一个Person具有相同的实例fullName并且您对其进行了调用fullName.

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