前言
在前面的一系列Scala编程基础中,我们介绍了Scala的基本语法、控制流、自定义函数、数据结构等内容。从本期开始将会陆续介绍Scala中面向对象的编程内容,包括类、对象、继承以及特质等。
类
跟Python、Java等编程语言一样,都包含一个非常重要的部分,那就是类。你可以将类理解为一个画布(或模板),它是一种抽象的对象,其内部一般都会包含两种对象,即属性(可以理解为一些特定变量所对应的值)和方法(理解为用于运算的函数)。
类的创建需要使用class关键词,后面紧跟类的名称(需要注意的是,类的名称应该遵循大驼峰规则,即首字母大写,如果名称包含多个单词,每个单词的首字母都需要大写)。语法如下:
代码语言:javascript复制class ClassName(参数名称: 数据类型) {
//类内字段
val 变量名称: 数据类型 = 初始值
//类内方法
def 方法名称(参数名称: 数据类型): 函数返回值类型 = {
方法体
}
}
当类创建好后,一般需要通过new关键词,构造一个类的实例,然后再通过实例返回类内字段的值和类内方法的运算,具体可以看下面的几个例子。
案例1 如下代码中构造了一个Ball类,其中包含一个成员字段(或成员变量)PI,和三个成员方法(或成员函数),这三个方法的功能分别是计算圆的周长、面积和球的体积。读者可以将如下代码复制到txt文件中,并给文件命名为ClassDemo01.scala。
代码语言:javascript复制// 导入第三方包
import scala.math
// 创建一个孤立对象,并定义代码的主入口(即main函数)
object ClassDemo01 {
def main(args: Array[String]): Unit = {
// 使用new关键词构造一个Ball类的实例对象
val ball = new Ball
// 查看ball的属性值
println("圆周率为:" ball.PI)
// 计算ball的周长
println("当半径为6.9时,圆的周长为:" ball.circumference(6.9))
// 计算ball的面积
println(s"当半径为5.8时,圆的面积为:${ball.area(5.8)}")
// 计算ball的体积
println(f"当半径为12.7时,球的体积为:${ball.volumn(12.7)}%.2f")
}
}
// 定义一个球类 -- 无参数列表的类
class Ball {
val PI = 3.14 // 成员字段
// 定义计算周长的方法
def circumference(R:Double): Double = {
2*PI*R
}
// 定义计算面积的方法
def area(R:Double): Double = {
PI*math.pow(R,2)
}
// 定义计算体积的方法
def volumn(R:Double): Double = {
4/3*PI*math.pow(R,3)
}
}
读者可以在terminal终端环境中,运行下面的命令,对scala文件做编译和执行:
scalac ClassDemo01.scala scala ClassDemo01
得到的结果如下:
在如上的例子中,定义类时并没有传递类的参数列表,接下来我们再看一个简单的例子,希望读者能够理解类以及上下两个例子的差异。
案例2 在下面的代码中我们构造了一个Income类,该类包含了两个参数,分别是字符型的name和双精度浮点型的income。类中没有成员字段,只有一个计算税后收入的方法taxIncome,读者可以将如下代码复制到txt文件中,并给文件命名为ClassDemo02.scala。
代码语言:javascript复制// 导入第三方包
import scala.io.StdIn._
// 创建一个孤立对象,并定义代码的主入口(即main函数)
object ClassDemo02{
def main(args:Array[String]): Unit={
val name = readLine("请输入您的姓名:n")
println("请输入您的税前收入:")
val income = readDouble()
// 对Income类实例化,需要传递两个类参数值
val myIncome = new Income(name, income.toDouble)
println(f"您好,${myIncome.name},您的税后收入为${myIncome.taxIncome}%.2f元.")
}
}
// 构造Income类,包含两个类参数
class Income(val name:String, val income:Double) {
// 定义税后收入的方法
def taxIncome() :Double = {
var res:Double = 0
if (income <= 5000) {res = income - 0}
else if (income <= 17000) {res = income - (210 (income-8000)*0.1)}
else {res = income - (210 900 (income-17000)*0.2)}
return res
}
}
读者可以在terminal终端环境中,运行下面的命令,对scala文件做编译和执行:
scalac ClassDemo02.scala scala ClassDemo02
得到的结果如下:
需要说明的是,如果类参数使用了val或var这样的关键词,则表明对应的参数便成了类的成员字段,可以通过".字段名"的方法调用对应的值;如果没有使用val或var关键词,并且类体中也没有使用到参数,此时无法通过".字段名"的方法调用对应的值,因为它不再属于类的成员字段。