"this"关键字如何在 Scala 辅助构造函数中使用和工作?



我刚刚开始学习 Scala,帮助我了解学生类有两个参数的年龄是如何打印

class Student(id: Int, name: String) {
var age: Int = 0
def showDetails() {
println(id + " " + name + " " + age)
}
def this(id: Int, name: String, age: Int) {
this(id, name)
this.age = age
}
}
object hi {
def main(args: Array[String]) {
var s = new Student(101, "Sun", 20);
s.showDetails()
}
}

年龄如何打印,其中学生类有两个参数

Student有两个构造函数。具有两个参数的辅助构造函数:

class Student(id: Int, name: String)

但它也通过this()定义了具有三个参数的附加构造函数:

def this(id: Int, name: String, age: Int)

main中创建Student的实例时,使用接受三个参数的辅助构造函数:

var s = new Student(101, "Sun", 20);

因此,年龄20。如果使用辅助构造函数,age仍将设置为0showDetails()打印出0

当你使用两个参数构造这个类时,构造过程将首先调用:

var age: Int = 0

将年龄设置为 0。因此,除非您专门更改它,否则学生的年龄将为 0。

当您使用三个参数调用时,这正是您所做的,您将 age 设置为 0,然后将其更改为第三个参数。

附言您正在隐式地将 id 和名称定义为私有值。最好明确地这样做。

这样做的原因是,如果您这样做:

class A(a: Int) {
}

那么 a 根本不是对象的一部分,a 只是构造函数的参数。

但是,如果您在方法中使用 :

class A(a: Int) {
def b: Int = a
}

然后 scala 需要保存它以供以后使用(当调用 b 时,它必须在构造之外可用(。因此,它将把它转变为一个私人价值。

为避免混淆,最好执行以下操作:

class A(private val a: Int) {
def b: Int = a
} 

最新更新