Параметр первичного конструктора, объявленный с использованием val, позволяет изменить значение - PullRequest
2 голосов
/ 08 июля 2019

Как показано ниже, параметры кода в первичном конструкторе определяются со значениями по умолчанию, а val означает, что значения этих параметров не должны изменяться. Но все же, почему значения меняются при инициализации конструктора

//Why values of Aname and Cname is getting overwritten      
class GFG(val Aname: String = "Ank", val Cname: String = "Constructors") {
  def display() = {
    println("Author name: " + Aname)
    println("Chapter name: " + Cname)

  }
}
//object main
object Main {
  def main(args: Array[String]) = {
    var obj = new GFG("a", "b")
    obj.display()
  }
}

Ответы [ 2 ]

5 голосов
/ 08 июля 2019

С

class GFG(val Aname: String = "Ank", val Cname: String = "Constructors")

вы создаете класс с конструктором с параметрами по умолчанию. Эти значения будут использоваться, только если вы не предоставите их явно. Это означает, что вы можете сделать:

new GFG("a", "b") //both parameters provided, no default values are used -> GFG(a,b)

new GFG("a") //only first parameter provided, second default value is used -> GFG(a,Constructors)

new GFG() // no parameters provided explicitly, only default values are used -> GFG(Ank,Constructors)

Как видите, вы не можете использовать значение по умолчанию для Aname, но явно для Cname, но это возможно, если вы использовали именованные параметры:

new GFG(Cname = "b") // GFG(Ank, b)
3 голосов
/ 08 июля 2019

Val с может быть присвоено значение во время инициализации, но не может быть изменено после инициализации, например

var obj = new GFG("a", "b") // ok
obj.Aname // res0: String = a
obj.Aname = "foo" // Error: reassignment to val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...