scala教程:主构造器 和 辅助构造器

介绍

和 Java 一样,Scala 创建对象也需要调用 构造方法,但构造方法与 java 不同

Scala 类的构造器包括:主构造器 和 辅助构造器

语法

class 类名(形参列表1) { // 主构造器,类名后面可以像方法那样加形参

 // 类体
 def this(形参列表2) { // 辅助构造器1

 }

 def this(形参列表3) { //辅助构造器2,可以有多个...

 }
}

主构造器说明

  1. 主构造器的声明直接放置于 类名之后

  2. 如果主构造器 无参数,小括号可省略,创建对象时,调用的构造方法的 小括号也可以省略。

  3. 如果想让主构造器变成私有的,可以在 () 之前加上 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 打电话

辅助构造器说明

  1. 辅助构造器:名称必须是 this (与java不同),可以有多个,编译器通过参数的个数及类型来区分,即:构造器重载

  2. 辅助构造器 没有返回值,也不需要声明 Unit

  3. 辅助构造器的 第一行代码 必须 直接 或者 间接 调用 主构造器。

例子:辅助构造器

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")
    }

  }


}

原文出处:/show_1IX1CrXvkSwj.html