16scala中的辅助构造器

39 阅读2分钟

(一)辅助构造函数

1. 构造函数(构造器)的作用是什么? 创建对象。

2. 构造函数只能有一个吗? 可以有多个。可以有很多个,其他的叫辅助构造函数。

辅助构造函数的作用是支持更多的创建对象的方式。

格式

辅助构造器的方法名固定为this,其参数不能使用var或val修饰,且必须在第一行代码中直接或间接调用主构造器

class 类名(参数列表A) {     def this(参数列表B){

      this(参数列表A)

      其他代码

    }

    def this(参数列表C){

      this(参数列表A)

      其他代码

    }

  }

  def main(args: Array[String]): Unit = {

    new 类名(参数列表A) // 直接调用主构造器

new 类名(参数列表B) // 调用辅助构造器
new 类名(参数列表C) // 调用辅助构造器
}

package level02

object Class06 {
// 链式
// arr.map(x => 2*x).filter(x=>x>=5).foreach(println)

// 实现要点:把当前方法的返回值设置为当前对象!
class Student() {
  def sayHi(): Student = {
    println("sayHi")
    this
  }

  def sayHello(): Student = {
    println("sayHello")
    this // 返回当前对象
  }
}

def main(args: Array[String]): Unit = {
  val stu = new Student()
  // 链式调用:方法.方法.方法.....
  stu.sayHi().sayHello()

  // val arr1 = Array(1,2,3)
  // arr1.map(x => 2*x).filter(x=>x>=5).foreach(println)
}
}

image.png 辅助构造器的作用

1.提供多种初始化方式:

辅助构造器允许类提供多种初始化选项,使得创建对象时更加灵活。

2.简化对象创建:

通过定义多个辅助构造器,您可以简化对象的创建过程,避免在主构造器中处理过多的参数。

3.调用主构造器:

辅助构造器可以通过 this 关键字调用主构造器,从而确保所有初始化逻辑都集中在主构造器中。

(二)案例-用户注册类

ss Register(val name:String, var email:String, var pwd:String, var // Scala辅助构造器

class Person(val name: String, val age: Int, val position: String) {

  

  // 场景1:为position属性提供默认值

  def this(name: String, age: Int) = {

    this(name, age, "员工")

  }

  // 场景2:只提供name,为age和position提供默认值

  def this(name: String) = {

    this(name, 18, "实习生")

  }

  // 场景3:无参构造器,使用默认值初始化所有属性

  def this() = {

    this("匿名用户", 20, "访客")

  }

  // 场景4:参数重载 - 使用不同的参数组合

  def this(name: String, position: String) = {

    this(name, 25, position)

  }

  // 显示人员信息的方法

  def displayInfo(): Unit = {

    println(s"姓名:name,年龄:name, 年龄:age, 职位:$position")

  }

} // 测试对象

object PersonDemo extends App {

  // 使用主构造器创建对象

  val person1 = new Person("张三", 30, "经理")

  person1.displayInfo()

  

  // 使用辅助构造器1 - 默认职位

  val person2 = new Person("李四", 25)

  person2.displayInfo()

  // 使用辅助构造器2 - 默认年龄和职位

  val person3 = new Person("王五")

  person3.displayInfo()

  // 使用辅助构造器3 - 无参构造

  val person4 = new Person()

  person4.displayInfo()

  // 使用辅助构造器4 - 参数重载

  val person5 = new Person("赵六", "工程师")

  person5.displayInfo()

}

package level02

// var 修饰的属性是可以被修改的
// val 修饰的属性是只读的,不能被修改
// Student() 构造函数(构造器),用来创建对象
// 1. 主构造函数 class Student()
// 2. 辅助构造函数


class Student(var name: String, val age: Int) {
  println("Student........")
  // 辅助构造函数
  // 特点:1. 名字就是this 2. 第一句代码就是调用主构造器
  def this() = {
    this("未知的", 18) // 调用主构造函数
    println("辅助构造器被调用了....")
  }

  def this(age: Int) = {
    this("未知的", age)
  }

  def sayHi(): Unit = {
    println(s"我是${name},我今年${age}")
  }
}

object Class01 {
  def main(args: Array[String]): Unit = {
    // 创建对象 -> new 会自动调用构造函数
    val stu1 = new Student("小花", 18)
    val stu2 = new Student()
    val stu3 = new Student(20)
    // 调用对象的方法
    stu1.sayHi()
    // 调用对象的方法
    stu2.sayHi()
    stu3.sayHi()
  }
}

image.png