为什么Scala中的对象中没有调用类参数?
为什么Scala中的对象中没有调用类参数?
在Scala中,为什么类参数并不是在对象上真正被调用的值?类参数是主构造方法的一部分,所以它不应该像Java那样设置对象的成员变量吗?为什么我们必须要创建单独的字段来作为在对象上设置的值?除了接受这个事实,是否有更好的解释?
admin 更改状态以发布 2023年5月23日
类参数是主构造函数的一部分,所以难道不应该设置对象的成员变量,就像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
如果你想要调用类的主构造器分配的参数,你需要将它们声明为字段。
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
现在是一个变量。因此你现在可以通过 Man
类的实例访问 name
。
val x = new Man("Jack",10) x.name // Jack
但你无法访问 age
,因为它是参数而不是字段。