Scala中类参数处的val是什么?

Scala中类参数处的val是什么?,scala,Scala,我有时会看到下面这样的东西 class Test(val str: String){ } 虽然我用val编写了一些示例代码,但我看不出通用声明和val的方式有什么区别 他们之间有什么区别? 什么时候应该使用它?如果您添加val,您的变量将在课堂外可见 // 'name' is a val class Person(val name: String) val p = new Person("Alvin Alexander") p.name

我有时会看到下面这样的东西

class Test(val str: String){
}
虽然我用
val
编写了一些示例代码,但我看不出通用声明和
val
的方式有什么区别

他们之间有什么区别?
什么时候应该使用它?

如果您添加
val
,您的变量将在课堂外可见

// 'name' is a val
class Person(val name: String)
val p = new Person("Alvin Alexander")
p.name                                  // String = Alvin Alexander
p.name = "Fred Flintstone"              // error: reassignment to val

// 'name' is neither var or val
class Person(name: String)
val p = new Person("Alvin Alexander")
p.name                                  // error: value name is not a member of Person
代码取自


更多信息

如果您添加
val
,您的变量将在课堂外可见

// 'name' is a val
class Person(val name: String)
val p = new Person("Alvin Alexander")
p.name                                  // String = Alvin Alexander
p.name = "Fred Flintstone"              // error: reassignment to val

// 'name' is neither var or val
class Person(name: String)
val p = new Person("Alvin Alexander")
p.name                                  // error: value name is not a member of Person
代码取自


更多信息

通过添加到@EntryLevelDev的答案中,您可以使用
javap
查看到底发生了什么

1.scala

class Test(val str: String){
}
第一步。scalac 1.scala

第二步。javap测试

从“1.scala”编译而来

2.scala:

class Test2(str: String){
    }
第一步。scalac2.scala

第二步。JavapTest2

从“1.scala”编译而来


因此,当您添加val时,scala会根据参数的名称生成一个方法,并将其公开,以便从外部可见。

通过添加到@EntryLevelDev的答案中,您可以使用
javap
查看到底发生了什么

1.scala

class Test(val str: String){
}
第一步。scalac 1.scala

第二步。javap测试

从“1.scala”编译而来

2.scala:

class Test2(str: String){
    }
第一步。scalac2.scala

第二步。JavapTest2

从“1.scala”编译而来

因此,当您添加val时,scala将根据参数的名称生成一个方法,并将其公开,以便从外部可见