在Scala中,类参数怎么不是真正在对象上调用的值?类参数是主构造函数的一部分,那么它不应该像Java一样设置对象的成员变量吗?为什么一定要单独做一个字段,才是在对象上设置的值呢?而不是一味的接受事实,有什么好的解释吗?
如果要调用类的主构造函数中分配的参数,就必须将其声明为field。
class Man(name: String, age: Int) {
def show = "My name is " + name + ", age " + age
}
下面是 name
和 age
是 构造参数. 它们只能在类范围内访问。
class Man(val name: String, age: Int) {
def show = "My name is " + name + ", age " + age
}
注意 name
现在是一个变量。所以现在你可以访问 name
与 Man
类的实例。
val x = new Man("Jack",10)
x.name // Jack
但你不能访问 age
因为它是参数不是字段。
类参数是主构造函数的一部分,那么它是不是应该像Java一样,设置对象的成员变量呢?
即使在Java中,构造函数参数也不会自动成为类的成员
public class User {
public User(String name, Integer age) {
// do something
}
}
User user = new User("Picard", 75);
String name = user.name // error
所以我们要做的是
public class User {
String name;
Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
}
为什么我们必须将对象上的值设置为单独的字段?
使用 case class
我们免费获得(以及 其他几件事)
case class User(name: String, age: Int)
val user = User("Picard", 75)
val name = user.name // ok