前言

在前面的一系列Scala编程基础中,我们介绍了Scala的基本语法、控制流、自定义函数、数据结构等内容。从本期开始将会陆续介绍Scala中面向对象的编程内容,包括类、对象、继承以及特质等。

跟Python、Java等编程语言一样,都包含一个非常重要的部分,那就是类。你可以将类理解为一个画布(或模板),它是一种抽象的对象,其内部一般都会包含两种对象,即属性(可以理解为一些特定变量所对应的值)和方法(理解为用于运算的函数)。

类的创建需要使用class关键词,后面紧跟类的名称(需要注意的是,类的名称应该遵循大驼峰规则,即首字母大写,如果名称包含多个单词,每个单词的首字母都需要大写)。语法如下:

class ClassName(参数名称: 数据类型) {    //类内字段    val 变量名称: 数据类型 = 初始值    //类内方法    def 方法名称(参数名称: 数据类型): 函数返回值类型 = {    方法体    }}

当类创建好后,一般需要通过new关键词,构造一个类的实例,然后再通过实例返回类内字段的值和类内方法的运算,具体可以看下面的几个例子。

案例1
如下代码中构造了一个Ball类,其中包含一个成员字段(或成员变量)PI,和三个成员方法(或成员函数),这三个方法的功能分别是计算圆的周长、面积和球的体积。读者可以将如下代码复制到txt文件中,并给文件命名为ClassDemo01.scala。

// 导入第三方包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

得到的结果如下:

大数据之脚踏实地学19--Scala中类的使用_scala

在如上的例子中,定义类时并没有传递类的参数列表,接下来我们再看一个简单的例子,希望读者能够理解类以及上下两个例子的差异。

案例2
在下面的代码中我们构造了一个Income类,该类包含了两个参数,分别是字符型的name和双精度浮点型的income。类中没有成员字段,只有一个计算税后收入的方法taxIncome,读者可以将如下代码复制到txt文件中,并给文件命名为ClassDemo02.scala。

// 导入第三方包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

得到的结果如下:

大数据之脚踏实地学19--Scala中类的使用_大数据_02

需要说明的是,如果类参数使用了val或var这样的关键词,则表明对应的参数便成了类的成员字段,可以通过".字段名"的方法调用对应的值;如果没有使用val或var关键词,并且类体中也没有使用到参数,此时无法通过".字段名"的方法调用对应的值,因为它不再属于类的成员字段。

结语

本期的内容就介绍到这里,下一期我们将介绍Scala中的构造器和对象。如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让更多的人学习和进步。

每天进步一点点:数据分析1480

大数据之脚踏实地学19--Scala中类的使用_大数据_03

长按扫码关注我