使用 val 声明的主构造函数参数允许更改值
Primary constructor parameter declared using val allows to change the value
如下代码所示,主构造函数中的参数使用默认值定义,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()
}
}
Val
s 可以在初始化时赋值,但在初始化后不能更改,例如
var obj = new GFG("a", "b") // ok
obj.Aname // res0: String = a
obj.Aname = "foo" // Error: reassignment to val
与
class GFG(val Aname: String = "Ank", val Cname: String = "Constructors")
您正在创建一个 class 带有默认参数的构造函数。仅当您未明确提供这些值时才会使用这些值。这意味着您可以:
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)
如下代码所示,主构造函数中的参数使用默认值定义,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()
}
}
Val
s 可以在初始化时赋值,但在初始化后不能更改,例如
var obj = new GFG("a", "b") // ok
obj.Aname // res0: String = a
obj.Aname = "foo" // Error: reassignment to val
与
class GFG(val Aname: String = "Ank", val Cname: String = "Constructors")
您正在创建一个 class 带有默认参数的构造函数。仅当您未明确提供这些值时才会使用这些值。这意味着您可以:
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)