空重载构造函数

我有以下班级。

class Student(id: String, name: String) { var id: String? = null var name: String? = null var grade: String? = null constructor(id: String, name: String, grade: String) : this(id,name) { this.grade = grade } } 

使用:

  var student = Student("AB001","Smith","N/A") prinln(student.id + student.name + student.grade) 

输出:

nullnullN / A

任何人都可以解释为什么我从默认的构造函数得到输出为空?

除了其他答案之外,还有另一种方法。 使用主构造函数参数直接初始化属性:

 class Student(id: String, name: String) { var id: String? = id var name: String? = name var grade: String? = null constructor(id: String, name: String, grade: String) : this(id,name) { this.grade = grade } } 

请注意,由于idname始终使用非空值进行初始化,所以可以省略? 。 除此之外,您可以在主构造函数中使用默认值省略次构造函数:

 class Student(id: String, name: String, grade: String? = null) { var id: String = id var name: String = name var grade: String? = grade } 

但是现在我们只剩下一个构造函数了,所以我们可以直接把属性拉到构造函数中:

 class Student( var id: String, var name: String, var grade: String? = null ) 

因为班级的身体现在是空的,我也省去了大括号。

 class Student { var id: String? = null var name: String? = null var grade: String? = null constructor(id: String, name: String) { this.id=id this.name=name } constructor(id: String, name: String, grade: String) : this(id, name) { this.grade = grade } } 

要么

 class Student(var id: String?, var name: String?) { var grade: String? = null constructor(id: String, name: String, grade: String) : this(id, name) { this.grade = grade } } 

要么

 class Student(id: String, name: String) { var id: String? = null var name: String? = null var grade: String? = null init { this.id = id this.name = name } constructor(id: String, name: String, grade: String) : this(id,name) { this.grade = grade } } 

init块是你在主构造函数中使用参数的方式,当它们没有被标记为val或者vars时,必须完成它。

换言之,由于您没有将主要构造函数中的参数(类名旁边的括号)标记为val或vars,因此不会自动将其分配为属性。 为了在主构造函数中使用参数,特别是那些没有被标记为变量和val的参数,你需要一个init块。

我不禁想到,你真正想要的是这个

 class Student (var id: String, var name: String, var grade: String? = null) 

也许甚至改变他们val而不是vars。