空重载构造函数
我有以下班级。
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 } }
请注意,由于id
和name
始终使用非空值进行初始化,所以可以省略?
。 除此之外,您可以在主构造函数中使用默认值省略次构造函数:
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。