和Java一样,scala构造对象也需要调用构造方法,并且scala中的构造器也支持重载。
scala类的构造器包括:主构造器和辅构造器
scala构造器的基本语法
class 类名(形参列表) { // 主构造器
// 类体
def this(形参列表) { // 辅助构造器
}
def this(形参列表) { //辅助构造器可以有多个...
}
}
案例:
object ConDemo01 {
def main(args: Array[String]): Unit = {
var p1 = new Person("Bob", 10)
println(p1)
var p2 = new Person("Martin")
println(p2)
var p3 = new Person("Tom", 11, "Beijing")
println(p3)
}
}
//创建Person对象的同时,初始化对象的age属性值和name属性值
class Person(inName: String, inAge: Int) {
var name: String = inName
var age: Int = inAge
override def toString: String = {
"name:" + this.name + "\t age:" + this.age + "\t address:" + this.address
}
//定义辅助构造器:修改属性的初始值
def this(name: String) {
//辅助构造器必须在第一行显式调用主构造器(可以是直接,也可以是间接)
this("jack", 20)
//通过辅构造器重新赋值
this.name = name
}
//定义辅助构造器:增加新属性,注意新的属性要先在辅助构造器外定义
var address: String = _
def this(inName: String, inAge: Int, address: String) {
this(inName, inAge)
this.address = address
}
}
注意细节:
-
Scala 构造器作用是完成对新对象的初始化,构造器没有返回值。
主构造器的声明直接放置于类名之后 -
主构造器会执行类定义中的所有语句,这里可以体会到 Scala 的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别
-
如果想让主构造器变成私有的,可以在()之前加上 private,这样用户只能通过辅助构造器来构造对象了
-
关于参数:
1)Scala 类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量
2)构造器参数用val关键字声明,那么 Scala 会将参数作为类的私有的只读属性使用
3) 如果参数使用 var 关键字声明,那么 Scala 会将参数作为类的成员属性使用,并会提供属性对应的 xxx()[类似 getter]/xxx_$eq()[类似 setter]方法,即这时的成员属性是私有的,但是可读写。
补充:Bean 属性
给某个属性加入@BeanPropetry 注解后,会生成 getXXX 和 和 setXXX 的方法