scala:主构造方法和辅助构造方法

@

构造器(构造方法)

作用:

  • 构造对象
  • 初始化属性(给对象的属性赋值)

Java中构造器

  • 方法名和类名保持一致
  • 构造方法没有返回值类型
  • 构造方法可以重载

Scala中构造器

主构造方法

  • 在声明类的同时,就定义了主构造方法,换言之,类就是主构造方法
  • 在一个类中,主构造方法只能有一个

辅助构造方法

  • 方法名必须叫this
  • 在辅助构造方法开始(第一行)必须直接或者间接的调用主构造方法
  • 辅助构造方法可以重载

scala代码示例

object Scala08_TestConstructor {
  def main(args: Array[String]): Unit = {
    //val std: Student08 = new Student08()
    //val std: Student08 = new Student08("jingjing")
    val std: Student08 = new Student08("jingjing",18)
  }
}

class Student08{

  println("0----Student08的主构造方法被调用了")


  var name:String = _
  var age:Int = _

  //声明辅助构造方法
  def this(name:String){
    //直接调用主构造方法
    this()
    println("1----Student08的辅助构造方法被调用了")
    this.name = name
  }

  def this(name:String,age:Int){
    //间接调用主构造方法
    this(name)
    println("2----Student08的辅助构造方法被调用了")
    this.age = age
  }


  /*//以下写法不是构造方法
  def Student08()={
    println("Student08的构造方法被调用了")
  }*/
}

scala有参数的主构造方法

  • 在声明主构造方法参数的时候,如果参数前什么也不加,那么参数就作为当前类的局部变量使用,不能作为类的属性被访问
  • 如果需要将参数作为属性被访问的话,那么在参数声明前加var或者val关键字
  • 主构造方法参数不能和类中定义的属性名相同
object Scala09_TestConstructor {
  def main(args: Array[String]): Unit = {
    //val stdJ: Student09 = new Student09
    //stdJ.name = "jingjing"
    //stdJ.age = 16
    //println(stdJ.name)
    var std = new Student09("jingjing",17)
    println(std.name)
  }
}

/*
//只提供无参的主构造,单独定义
class Student09{
  var name:String = _
  var age:Int = _
}
*/

/*
//在scala语言中,以下写法比较少,如果这样写,那就是受java毒害太深了
class Student09(namePararm:String,ageParam:Int){
  var name:String = namePararm
  var age:Int = ageParam
}
*/

//在声明主构造方法参数的时候,如果参数前什么也不加,那么参数就作为当前类的局部变量使用,不能作为类的属性被访问
//如果需要将参数作为属性被访问的话,那么在参数声明前加var或者val关键字
class Student09(var name:String, var age:Int){
  def m1(): Unit ={
    println(name)
    println(age)
  }
}
/*
//同时提供主、辅助构造方法
class Student09{
  var name:String = _
  var age:Int = _

  def this(name:String,age:Int){
    this()
    this.name = name
    this.age = age
  }
}*/
posted @ 2021-02-24 14:45  孙晨c  阅读(466)  评论(0编辑  收藏  举报