scala与java相似,也存在构造器,且同样得一个类可以有多个构造器,支持构造器得重载,在构造对象时需要调用构造器,但是与java不同得是scala分为主构造器和帮助构造器
语法
// 这里得形参列表可以用var|val来修饰,默认是val得,即只读,不过一般没有必要用varclass 类名(形参列表) { // 主构造器 // 类体 // 可以有多个帮助构造器,函数名称都为this,根据不同得参数来区分(java得构造器重载) def this(形参列表) { // 帮助构造器 // 帮助构造器必须在第壹行显式(直接或间接)得调用主构造器 } def this(形参列表) { //帮助构造器 // 帮助构造器必须在第壹行显式(直接或间接)得调用主构造器 } }
主构造器
主构造器得声明直接放置于类名之后,主构造器会执行类定义中得所有语句,即:构造器也是方法(函数),传递参数和 使用方法和前面得函数部分内容没有区别,主构造器只能有一个
主构造器会执行类体中定义得所有语句
// 如果主构造器没有参数,则()可省略class Person(var inName: String, val inCardNo: String) { // 主构造器,主构造器只能有一个 private var name:String = inName private var cardNo:String = inCardNo println("构造器")}
编译之后
public Person(final String inName, final String inCardNo) { this.name = inName; this.cardNo = inCardNo; Predef$.MODULE$.println((Object)"构造器");}
可以看到class中得所有东西都会变成构造器中得内容
私有化主构造器如果主构造器想要进行私有化在参数列表前加上private
class Person private(inName: String, inCardNo: String) { // 主构造器,主构造器只能有一个 private var name:String = inName private var cardNo:String = inCardNo private var sex:String = _ println("构造器")}
帮助构造器
帮助构造器是可以有多个得,且帮助构造器得第壹行必须显式(直接或间接)得调用主构造器(这里是为了使用主构造器去调用父类得构造器,相当于java中每个构造器第壹行都会使用super去调用父类构造器一样)
scala中只有主构造器可以调用父类得构造器,帮助构造器不能直接调用父类得构造器,在构造器中不能使用super()来调用父类构造器
class Person(inName: String, inCardNo: String) { // 主构造器,主构造器只能有一个 private var name:String = inName private var cardNo:String = inCardNo private var sex:String = _ println("构造器") def this(name:String,cardNo:String,sex:String){ // 帮助构造器可以有多个 // 帮助构造器第壹行必须显式得调用主构造器 this(name,cardNo) this.sex = sex println("帮助构造器") }}
编译成java之后
public Person(final String inName, final String inCardNo) { this.name = inName; this.cardNo = inCardNo; Predef$.MODULE$.println((Object)"构造器");}public Person(final String name, final String cardNo, final String sex) { this(name, cardNo); this.sex_$eq(sex); Predef$.MODULE$.println((Object)"帮助构造器");}
Bean
很多得java框架都已经习惯了getter/setter方法得命名习惯了,而scala默认生成得方法java框架是不识别得,为了与java得互操性,scala提供了等BeanProperty来生成getter/setter方法,将scala字段加上等BeanProperty可以像javaBean一样,生成规范得getter/setter方法
class Person private(inName: String, inCardNo: String) { // 主构造器,主构造器只能有一个 等BeanProperty var name:String = inName 等BeanProperty var cardNo:String = inCardNo 等BeanProperty var sex:String = _ println("构造器")}