scala中的主构造器和辅助构造器

构造器(constructor)又叫构造方法,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。

回顾一下java中的构造器特点:

在Java中一个类可以定义多个不同的构造方法,(构造方法重载),如果程序员没有定义构造方法,系统会自动给类生成一个默认无参构造方法(也叫默认构造器),

一旦定义了自己的构造方法(构造器),默认的构造方法就覆盖了,就不能再使用默认的无参构造方法,除非显示的定义一下;

Scala构造器的介绍

和Java一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法(即scala中构造器也支持重载)。

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

Scala构造器的基本语法:

class 类名(形参列表) {  // 主构造器   注意这种定义格式和java不同
   // 类体
   def  this(形参列表) {  // 辅助构造器
   }
   def  this(形参列表) {  //辅助构造器可以有多个...
   }
} 

辅助构造器 函数的名称this, 可以有多个,编译器通过不同参数来区分.

Scala构造器注意事项和细节

  • Scala构造器作用是完成对新对象的初始化,构造器没有返回值。
  • 主构造器的声明直接放置于类名之后。
  • 主构造器会执行类定义中的所有语句(方法除外),这里可以体会到Scala的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别
  • 如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略。
  • 辅助构造器名称为this(这个和Java是不一样的),多个辅助构造器通过不同参数列表进行区分, 在底层就是构造器重载。
  • 如果想让主构造器变成私有的,可以在()之前加上private,这样用户只能通过辅助构造器来构造对象了。
  • 辅助构造器的声明不能和主构造器的声明一致,会发生错误(即构造器名重复)。
  • 辅助构造器的第一行一定要调用主构造器或者其他辅助构造器。

一些示例:

object People {
  def main(args: Array[String]): Unit = {
    val s = new Student
    s.name = "tom"
    s.age = 19
    s.printInfo()
  }
}
class Student { // 或者 class Student()  这样写也可以
  var name: String = _
  var age: Int = _
  // 辅助构造器无论是直接或间接,最终都一定要调用主构造器,执行主构造器的逻辑,并且调用的代码一定要放在第一行
  def this(name: String) {
    this() // 直接调用主构造器(主构造器是一个空的构造器)
    this.name = name
    print("this(name: String)")
  }
  def this(name: String, age: Int) {
    this() // 直接调用主构造器
    this.name = name
    this.age = age
    println("this(name: String, age: Int)")
  }
  def this(age: Int) {
    this("jack") // 调用其他辅助构造器,但是这里也间接调用了主构造器,因为 def this(name: String)中调用了主构造器
    this.age = age
  }
  println("主构造器中的语句")
  def printInfo(): Unit = {
    println("name:" + name)
    println("age: " + age)
  }
}

有子父类继承关系中主/辅助构造器之间的关系:

构造器参数:

  1. Scala类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量;(例如: class Persion(name : String))
  2. 如果参数使用val关键字声明,那么Scala会将参数作为类的私有的只读属性使用 ; (例如: class Persion(val name : String))
  3. 如果参数使用var关键字声明,那么那么Scala会将参数作为类的成员属性使用,并会提供属性对应的xxx()[类似getter]/xxx_$eq()[类似setter]方法,即这时的成员属性是私有的,但是可读写。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值