怎么"这"关键字是在Scala Auxiliary Constructor中使用和工作?

时间:2017-07-19 11:32:07

标签: 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()
  }
}

2 个答案:

答案 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仍会设置为0showDetails()会打印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
}