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

2019-05-22 20:42:31 浏览数 (1)

前言

在前面的一系列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关键词,并且类体中也没有使用到参数,此时无法通过".字段名"的方法调用对应的值,因为它不再属于类的成员字段。

0 人点赞