我刚开始学习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()
}
}
答案 0 :(得分:3)
如何打印年龄,学生班有两个参数
Student
有两个构造函数。具有两个参数的辅助构造函数:
class Student(id: Int, name: String)
但它还通过this()
定义了一个带有三个参数的附加构造函数:
def this(id: Int, name: String, age: Int)
在Student
中创建main
的实例时,使用接受三个参数的辅助构造函数:
var s = new Student(101, "Sun", 20);
因此,20
是年龄。如果您使用辅助构造函数,age
仍会设置为0
,showDetails()
会打印0
。
答案 1 :(得分:2)
当您使用两个参数构造此类时,构造过程将首先调用:
var age: Int = 0
将年龄设置为0.因此除非您专门更改,否则学生的年龄将为0。
当您使用三个参数调用时,这正是您所做的,您将age设置为0,然后将其更改为第三个参数。
P.S。您将id和名称隐式定义为私有val。明确地做它会更好。
原因是如果你这样做:
class A(a: Int) {
}
然后a根本不是对象的一部分,a只是构造函数的一个参数。
如果您在方法中使用a:
class A(a: Int) {
def b: Int = a
}
然后scala需要保存它以供以后使用(当调用b时,它必须在构造之外可用)。因此它会将其转换为私人val。
为避免混淆,最好这样做:
class A(private val a: Int) {
def b: Int = a
}