Scala中的辅助构造器

28 阅读2分钟

理解构造器

构造器是一个函数,在new的时候,被自动调用,它的作用是实例化对象。

new Class() 就是在调用构造器,或者叫调用构造函数。

如:

object Main {

    // 定义类

class Customer() {

    println("构造函数被调用")

  }

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

    val c = new Customer()

  }

}

构造函数的参数

格式: class 类名([参数列表])

主构造函数的参数

1. var 是可以修改的属性

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

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

辅助构造函数

格式:

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

演示:

class 类名(参数列表A) {

    def this(参数列表B){

      this(参数列表A)

      其他代码

    }

    def this(参数列表C){
        this(参数列表A)
        其他代码

    }

  }

  def main(args: Array[String]): Unit = {
    new 类名(参数列表A// 直接调用主构造器
    new 类名(参数列表B// 调用辅助构造器  
    new 类名(参数列表C) // 调用辅助构造器  
  }

如:

/*  类是属性的集合
  Student 构造函数用来创造对象的
                辅助构造函数 提供多种创建对象的方式*/
class  MyStudent(var name:String, var age:Int) {
  println("构造函数被调用...")

  def sayHi():Unit = {
    println(s"我是${name},我今年${age}")
  }
  /*    辅助构造函数
    1.他的名字就是this
    2.他内部的第一句代码必须是调用 主构造函数 this("无名氏",0)*/
  def this() = {
    this("无名氏",0)
    println("构造函数1被调用...")

  }
  def this(name:String) ={
    this(name,0)
    println("构造函数1被调用...")
  }
}

object f1028 {
  def main(args: Array[String]): Unit = {
/*//    创建一个学生对象
    val stu1 = new Student("小花",18)
//    调用对象的方法
    stu1.sayHi()

    stu1.age= 19
//    调用对象的方法
    stu1.sayHi()

//    这里没有设置参数 他会调用辅助构造函数
    val stu2 = new Student()
    stu2.sayHi()*/

//    这里设置l参数 他会调用辅助构造函数
    val stu3 = new MyStudent("小明")
    stu3.sayHi()
  }
}
//运行结果:
构造函数被调用...
构造函数1被调用...
我是小明,我今年0

private

在方法前面添加 private 那这个方法是私有的 他不能再class的外部被访问。

如:

object i1028 {
  //私有 private
  class Student1(var name:String, var age:Int) {

//    在方法前面添加 private 那这个方法是私有的 他不能再class的外部被访问
    private def song():Unit = {
      println("我在唱歌...")
    }

    def sayHi():Unit ={
      println(s"我是${name},我今年${age}")
//私有方法 在类部是可以正常调用的
      song()
    }
  }

  def main(args: Array[String]): Unit = {
    val stu3 = new Student1("小明",18)
    stu3.sayHi()
    //stu3.song() //会报错
  }
}
//运行结果:
我是小明,我今年18
我在唱歌...