构造器(构造方法)
作用:
- 构造对象
- 初始化属性(给对象的属性赋值)
Java中构造器
- 方法名和类名保持一致
- 构造方法没有返回值类型
- 构造方法可以重载
Scala中构造器
主构造方法
- 在声明类的同时,就定义了主构造方法,换言之,类就是主构造方法
- 在一个类中,主构造方法只能有一个
辅助构造方法
- 方法名必须叫
this
- 在辅助构造方法开始(第一行)必须直接或者间接的调用主构造方法
- 辅助构造方法可以重载
scala代码示例
代码语言:javascript复制object Scala08_TestConstructor {
def main(args: Array[String]): Unit = {
//val std: Student08 = new Student08()
//val std: Student08 = new Student08("jingjing")
val std: Student08 = new Student08("jingjing",18)
}
}
class Student08{
println("0----Student08的主构造方法被调用了")
var name:String = _
var age:Int = _
//声明辅助构造方法
def this(name:String){
//直接调用主构造方法
this()
println("1----Student08的辅助构造方法被调用了")
this.name = name
}
def this(name:String,age:Int){
//间接调用主构造方法
this(name)
println("2----Student08的辅助构造方法被调用了")
this.age = age
}
/*//以下写法不是构造方法
def Student08()={
println("Student08的构造方法被调用了")
}*/
}
scala有参数的主构造方法
- 在声明主构造方法参数的时候,如果参数前什么也不加,那么参数就作为当前类的局部变量使用,不能作为类的属性被访问
- 如果需要将参数作为属性被访问的话,那么在参数声明前加
var
或者val
关键字 - 主构造方法参数不能和类中定义的属性名相同
object Scala09_TestConstructor {
def main(args: Array[String]): Unit = {
//val stdJ: Student09 = new Student09
//stdJ.name = "jingjing"
//stdJ.age = 16
//println(stdJ.name)
var std = new Student09("jingjing",17)
println(std.name)
}
}
/*
//只提供无参的主构造,单独定义
class Student09{
var name:String = _
var age:Int = _
}
*/
/*
//在scala语言中,以下写法比较少,如果这样写,那就是受java毒害太深了
class Student09(namePararm:String,ageParam:Int){
var name:String = namePararm
var age:Int = ageParam
}
*/
//在声明主构造方法参数的时候,如果参数前什么也不加,那么参数就作为当前类的局部变量使用,不能作为类的属性被访问
//如果需要将参数作为属性被访问的话,那么在参数声明前加var或者val关键字
class Student09(var name:String, var age:Int){
def m1(): Unit ={
println(name)
println(age)
}
}
/*
//同时提供主、辅助构造方法
class Student09{
var name:String = _
var age:Int = _
def this(name:String,age:Int){
this()
this.name = name
this.age = age
}
}*/