scala中的辅助构造器

52 阅读3分钟

主构造函数 的参数

1. var 是可以修改的属性

2. val 是不可以修改的属性

3.而没有使用val或者var修饰的,不是属性,不可在外部访问,不可改写。

代码演示

object Main {

 // 定义类

class Customer(val name:String, var sex:String,var age:Int) {

    def sayHello(msg:String ) = {

      println("msg:", msg)

    }

  }

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

    val c = new Customer(“小花”,”女”)

    c.sex = "男"// 正确  
    c.name = "小明" // 错误,name是val修饰的

  }

}

this关键字链式风格

this在类内部表示当前对象,我们可以利用这个特点实现对象方法的链式调用

def sayHello():this.type= {    
this

}  
def eat():this.type= {    
    this

}  
s = new Student()  
s.sayHello().eat().say()

辅助构造函数

辅助构造器的方法名固定为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) // 调用辅助构造器  
  }

实例

// 定义类

// 主构造函数

class Customer(var name:String, var:sex:String) {

  var age:Int = 0     
//   辅助构造器

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

this(name, sex)  
this.age = age  
  }  
}

辅助构造器的作用有

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

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

2.简化对象创建:

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

3.调用主构造器:

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

例题

定义一个用户注册类,它提供多种注册方式。


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, 年龄:$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()

}