构造器的定义
每个类都有一个主构造器,这个构造器和类定义"交织"在一起类名后面的内容就是主构造器,
如果参数列表为空的话,()可以省略
scala的类有且仅有一个主构造器,要想提供更加丰富的构造器,就需要使用辅助构造器,辅助构造器是可选的,它们叫做this
注意:主构造器会执行类定义中的所有语句
例子一
class User { // 类默认有一个无参的主构造函数
}
val user = new User
例子二
class User2(val name: String, age: Int) { // 两个参数的主构造函数
}
val user2 = new User2("jim", 23)
user2.name // 使用val修饰的变量默认是成员变量对象可以访问
// user2.age // age没有使用val或者var修饰 所以不能被访问
例子三
class User3 {
var name: String = _
var age: Int = _
// 辅助构造函数
def this(name: String, age: Int) {
// 构造函数中的首行必须调用主构造函数或者其他构造函数
this()
this.name = name
this.age = age
}
// 辅助构造函数
def this(msg: String) = {
// 首行调用一个构造
this("ww", 12)
println(msg)
}
}
val u1 = new User3()
val u2 = new User3("")
val u3 = new User3("lisi", 23)
println(u3.name)
总结:
1,有两类构造器:主构造器,辅助构造器
2,构造器的定义位置 def this(){}
主构造器和类交织在一起,class Student2(val name: String, var age: Int)
3, 辅助构造器是一个特殊的方法,定义在类中 def this(name:String,age:Int,gender:String)
4,辅助构造器,第一行必须调用主构造器(或者其他的辅助构造器)
5,辅助构造器的参数不能和主构造器的参数完全一致(参数个数,参数类型,参数顺序)
6,可以定义空参的辅助构造器,但是主构造器的参数必须进行初始化赋值
7,作用域:辅助构造器的作用域,只在方法中,主构造器的作用域是类中除了成员属性和
成员方法之外的所有范围(可以通过反编译查看源码)
构造器的参数说明
- 主构造器的参数没有使用var/val修饰 ,那么他的参数就是局部变量
- val修饰的构造函数的参数是类的成员私有属性 ,只读
- var修饰的构造函数的参数是类的私有成员属性 ,但是是可读可写的