介绍
和 Java 一样,Scala 创建对象也需要调用 构造方法,但构造方法与 java 不同
Scala 类的构造器包括:主构造器 和 辅助构造器
语法
class 类名(形参列表1) { // 主构造器,类名后面可以像方法那样加形参
// 类体
def this(形参列表2) { // 辅助构造器1
}
def this(形参列表3) { //辅助构造器2,可以有多个...
}
}
主构造器说明
主构造器的声明直接放置于 类名之后
如果主构造器 无参数,小括号可省略,创建对象时,调用的构造方法的 小括号也可以省略。
如果想让主构造器变成私有的,可以在
()之前加上private,这样只能通过 辅助构造器来 创建 对象
例子:主构造器
class Phone() { //没有参数可以省略小括号 ()
var cpu:String = "骁龙"
def call(num:String):Unit = {
println("用 "+cpu+" 给 "+num+" 打电话")
}
}
object Phone{
def main(args: Array[String]): Unit = {
val phone:Phone = new Phone//可以省略小括号()
phone.call("110")
}
}
执行结果:
用 骁龙 给 110 打电话
主构造器会执行类中的 所有语句(方法除外)
主构造器会执行类中的 所有语句(方法除外),因为 Scala 是 函数式 编程,构造器也是方法(函数),所以可以在 类中 写 语句
例子
class Phone() { //没有参数可以省略小括号 ()
var cpu:String = "骁龙"
println("主构造方法") // 此代码写在 主构造器中,所以不报错
def call(num:String):Unit = {
println("用 "+cpu+" 给 "+num+" 打电话")
}
}
object Phone{
def main(args: Array[String]): Unit = {
val phone:Phone = new Phone//可以省略小括号()
phone.call("110")
}
}
执行结果:
主构造方法
用 骁龙 给 110 打电话
辅助构造器说明
辅助构造器:名称必须是
this(与java不同),可以有多个,编译器通过参数的个数及类型来区分,即:构造器重载辅助构造器 没有返回值,也不需要声明
Unit辅助构造器的 第一行代码 必须 直接 或者 间接 调用 主构造器。
例子:辅助构造器
class Phone {
var cpu:String = "骁龙"
println("主构造方法")
def this(cpu:String) = {
this //直接调用主构造器,这里省略小括号(),必须执行主构造器,否则报错
println("辅助构造器1")
this.cpu = cpu
}
def call(num:String):Unit = {
println("用 "+cpu+" 给 "+num+" 打电话")
}
}
object Phone{
def main(args: Array[String]): Unit = {
// val phone:Phone = new Phone
// phone.call("110")
val phone2:Phone = new Phone("A100")
phone2.call("110")
}
}
例子:多个辅助构造器
class Phone {
var cpu:String = "骁龙"
var ram:Int = 8
println("主构造方法")
def this(cpu:String) = {
this
println("辅助构造器1")
this.cpu = cpu
}
def this(cpu:String,ram:Int) = {
this
println("辅助构造器2")
this.cpu = cpu
this.ram = ram
}
def call(num:String):Unit = {
println(s"用 $cpu $ram 给 "+num+" 打电话")
}
}
object Phone{
def main(args: Array[String]): Unit = {
// val phone:Phone = new Phone
// phone.call("110")
// val phone2:Phone = new Phone("A100")
// phone2.call("110")
val phone2:Phone = new Phone("A100",16)
phone2.call("110")
}
}
辅助构造器 和 主构造器的形参列表 不能相同
注意: 辅助构造器 和 主构造器的形参列表 不能相同,否则报错
代码
object s27zhugouzaoqi {
def main(args: Array[String]): Unit = {
val iphone=new Phone()
}
class Phone {
var cpu:String = "骁龙"
var ram:Int = _
println("主构造方法")
def this() = {
this //直接调用主构造器,这里省略小括号()
println("辅助构造器0")
}
}
}

