在Scala中,类参数怎么不是真正的值被调用在对象上?

问题描述 投票:0回答:1

在Scala中,类参数怎么不是真正在对象上调用的值?类参数是主构造函数的一部分,那么它不应该像Java一样设置对象的成员变量吗?为什么一定要单独做一个字段,才是在对象上设置的值呢?而不是一味的接受事实,有什么好的解释吗?

scala
1个回答
5
投票

如果要调用类的主构造函数中分配的参数,就必须将其声明为field。

class Man(name: String, age: Int) {
      def show = "My name is " + name + ", age " + age
}

下面是 nameage构造参数. 它们只能在类范围内访问。

class Man(val name: String, age: Int) {
      def show = "My name is " + name + ", age " + age
}

注意 name 现在是一个变量。所以现在你可以访问 nameMan 类的实例。

val x  = new Man("Jack",10)
x.name // Jack

但你不能访问 age 因为它是参数不是字段。


3
投票

类参数是主构造函数的一部分,那么它是不是应该像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
© www.soinside.com 2019 - 2024. All rights reserved.