7 scala的类构造器

在创建对象的时候,需要调用类的构造器。Scala 提供了主构造器和辅助构造器。

1 主构造器

与 Java 一样,如果我们没有特别定义,那么 Scala 提供的默认构造器是没有参数的。

我们可以在类名后,指定构造器的参数列表,列表里的参数将成为类的成员属性,这样的构造器叫做主构造器。定义的语法如下:

scala 复制代码
class 类名(var/val 参数名: 参数类型 = 默认值, var/val 参数名: 参数类型 = 默认值 ...) {
	// 构造器代码
}

下面的例子中,我们在主构造器中定义了 name, age, club 三个参数:

scala 复制代码
class FootballPlayer(name: String, age: Int = 20, club: String = "FIFA") {
  var price: Double = 100_0000

  def hello(): String = {
    s"${this.name} is in ${this.club}, ${this.age} years old. Pay ${this.price} dollar to purchase him."
  }
}

object App {
  def main(args: Array[String]): Unit = {
    val footBallPlayer = new FootballPlayer("Cristiano Ronaldo", 39, "Al-Nassr FC")
    println(footBallPlayer.hello())
  }
}

运行后,控制台输出:

markdown 复制代码
Cristiano Ronaldo is in Al-Nassr FC, 39 years old. Pay 1000000.0 dollar if you want to purchase him.

2 辅助构造器

如果需要使用多种方式创建对象,可以使用辅助构造器。定义辅助构造器和定义方法类似,通过关键字 def 定义,不同的是,这个方法的名称固定为 this,语法如下:

scala 复制代码
def this(参数名: 参数类型, 参数名: 参数类型, ...) {
	// 构造器代码
}

例如:

scala 复制代码
/**
 * 球员信息类
 *
 * @param name 球员姓名
 * @param age  年龄
 * @param club 所在俱乐部
 */
class FootballPlayer(name: String, age: Int = 20, club: String = "FIFA") {
  /**
   * 身价
   */
  var price: Double = 100_0000

  /**
   * 辅助构造器
   *
   * @param name  球员姓名
   * @param age   年龄
   * @param club  所在俱乐部
   * @param price 身价
   */
  def this(name: String, age: Int, club: String, price: Double) = {
    // 调用主构造器
    this(name, age, club)
    this.price = price
  }

  def hello(): String = {
    s"${this.name} is in ${this.club}, ${this.age} years old. Pay ${this.price} dollar to purchase him."
  }
}

object App {
  def main(args: Array[String]): Unit = {
    val footBallPlayer = new FootballPlayer("Cristiano Ronaldo", 39, "Al-Nassr FC", 1200_0000)
    println(footBallPlayer.hello())
  }
}
相关推荐
難釋懷3 分钟前
bash的特性-命令和文件自动补全
开发语言·bash
Aska_Lv4 分钟前
分布式锁---并发问题解决方案:分布式锁,以及不用锁方案
后端
胡斌附体5 分钟前
qt designer 创建窗体选择哪种屏幕大小
开发语言·qt
Yharim10 分钟前
mybatis中一对一、多对多关联查询怎么实现
后端·mybatis
用户15294368495911 分钟前
谷歌云代理商:‌如何设置谷歌云服务器的防火墙规则?‌
后端
玛奇玛丶12 分钟前
面试官:MYSQL自增id超过int最大值怎么办?
后端·mysql
绝无仅有19 分钟前
Docker Compose 安装Elasticsearch8和kibana和mysql8和redis5 并重置密码的经验与总结
后端·面试·架构
ZStack开发者社区30 分钟前
ZStack文档DevOps平台建设实践
java·大数据·开发语言·devops
强化学习与机器人控制仿真34 分钟前
ROS & ROS2 机器人深度相机激光雷达多传感器标定工具箱入门教程(一)
开发语言·人工智能·stm32·深度学习·机器人·自动驾驶