我刚刚开始学习 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
仍将设置为0
showDetails()
打印出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
}