zih*_*oyu 46 constructor scope scala immutability
有什么区别:
class Person(name: String, age: Int) {
  def say = "My name is " + name + ", age " + age
}
和
class Person(val name: String, val age: Int) { 
  def say = "My name is " + name + ", age " + age
}
我可以将参数声明为vars,并在以后更改它们的值吗?例如,
class Person(var name: String, var age: Int) {
  age = happyBirthday(5)
  def happyBirthday(n: Int) {
    println("happy " + n + " birthday")
    n
  }
}
om-*_*nom 48
对于第一部分,答案是范围:
scala> class Person(name: String, age: Int) {
     |   def say = "My name is " + name + ", age " + age
     | }
scala> val x = new Person("Hitman", 40)
scala> x.name
<console>:10: error: value name is not a member of Person
              x.name
如果您使用参数前缀val,则var它们将在课外显示,否则,它们将是私有的,您可以在上面的代码中看到.
是的,你可以改变var的值,就像通常一样.
Bri*_*new 10
这个
class Person(val name: String, val age: Int)
使字段的用户可以在外部使用,例如,您可以稍后进行
val p = new Person("Bob", 23)
val n = p.name
如果将args指定为var,则范围与for相同val,但字段是可变的.
如果您熟悉Java,可以从这个示例中获得想法:
class Person(name: String, age: Int)
类似于
class Person {
  public Person(String name, int age) {
  }
}
而
class Person(var name: String, var age: Int) // also we can use 'val'
类似于
class Person {
  String name;
  int age;
  public Person(String name, int age) {
     this.name = name;
     this.age = age;
  }
}
直觉是没有var/val,变量只能在构造函数中访问.如果添加了var/val,则该类将具有相同名称的成员变量.