• 2023_Spark_实验五:Scala面向对象部分演示(一)(IDEA开发)


    1、面向对象的基本概念

    把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象,面向

    对象的三大特征:

    •  封装

    •  继承

    •  多态

    2、类的定义

    简单类和无参方法

    1. class Counter{
    2. private var value =0;
    3. def increment() { value+=1};
    4. def current() =value;
    5. }
    6. //注意:class 前面没有public 关键字修饰

    如果要开发main方法,需要将main方法定义在该类的伴生对象中,即:object对

    象中,(后续做详细的讨论):

    1. class Counter{
    2. private var value =0;
    3. def increment() { value+=1};
    4. def current() =value;
    5. }
    6. //Scala 中类的定义
    7. class Student1{
    8. //定义属性
    9. private var stuName:String = "Tom"
    10. private var stuAge:Int =20
    11. //成员方法
    12. def getStuName():String = stuName
    13. def setStuName(newName:String) =this.stuName=newName
    14. def getStuAge():Int = stuAge
    15. def setStuAge(newAge:Int) = this.stuAge=newAge
    16. }
    17. object student {
    18. def main(args: Array[String]): Unit = {
    19. //测试student1
    20. var s1 = new Student1
    21. //第一次输出
    22. println(s1.getStuName() + "\t" + s1.getStuAge())
    23. //调用set方法
    24. s1.setStuName("Mary")
    25. s1.setStuAge(25)
    26. //第二次输出
    27. println(s1.getStuName() + "\t" + s1.getStuAge())
    28. //第三次输出
    29. // println(s1.stuName + "\t" + s1.stuAge)
    30. }
    31. }

    3、属性的getter和setter方法

    当定义属性是private时候,scala会自动为其生成对应的get和set方法,如下所

    示:

    private var stuName:String = "Tom"

    get方法: stuName ----> s2.stuName() 由于stuName是方法的名字,所

    以可以加上一个括号

    set方法: stuName_= ----> stuName_= 是方法的名字

    定义属性:private var money:Int = 1000 希望money只有get方法,没有

    set方法??

    办法:将其定义为常量private val money:Int = 1000

    private[this]的用法:该属性只属于该对象私有,就不会生成对应的set和

    get方法。如果这样,就不能直接调用,例如:s1.stuName ---> 错误

    1. //属性的get 和 set 方法
    2. /*
    3. 1.当定义属性是private 时候,scala会自动为其生成对应的get 和set方法
    4. private var stuName:String = "Tom"
    5. (1) get 方法:stuName ----> s2.stuName()
    6. (2) set 方法:stuName_=
    7. 2.定义属性:private var money:Int = 1000 希望money只有get方法,没有set方法?
    8. 方法:将其定义为常量private val money:Int = 1000
    9. 3.private[this]
    10. 3.private[this]的方法:该属性只属于该对象私有,就不会生成对应的set和get方法
    11. */
    12. class Student2 {
    13. //定义属性
    14. private var stuName:String = "Tom"
    15. //private [this] var stuAge:Int =20
    16. private var stuAge:Int = 20
    17. private val money:Int = 1000
    18. }
    19. //测试
    20. object Student2 {
    21. def main(args: Array[String]): Unit = {
    22. var s2 = new Student2
    23. println(s2.stuName + "\t" + s2.stuAge)
    24. println(s2.stuName + "\t" +s2.stuAge + "\t" + s2.money)
    25. //修改money的值 --》 error
    26. //s2.money = 2000
    27. }
    28. }

    4、内部类(嵌套类)

    我们可以在一个类的内部在定义一个类,如下:我们在Student类中,再定义了

    一个Course类用于保存学生选修的课程:

    1. import scala.collection.mutable.ArrayBuffer
    2. //嵌套类:内部类
    3. class Student3 {
    4. //定义一个内部类:记录学生选修的课程信息
    5. class Course(val courseName:String,val credit:Int){
    6. //定义其他方法
    7. }
    8. private var stuName:String = "Tom"
    9. private var stuAge:Int = 20
    10. //定义一个ArrayBuffer记录学生选修的所有课程
    11. private var courseList = new ArrayBuffer[Course]()
    12. //定义方法往学生信息中添加新的课程
    13. def addNameCourse(cname:String,credit:Int): Unit ={
    14. //创建新的课程
    15. var c = new Course(cname,credit)
    16. //将课程加入list
    17. courseList += c
    18. }
    19. }
    20. //测试
    21. object Student3 {
    22. def main(args: Array[String]): Unit = {
    23. //创建学生对象
    24. var s3 = new Student3
    25. //给该学生添加新的课程
    26. s3.addNameCourse("Chinese",2)
    27. s3.addNameCourse("English",3)
    28. s3.addNameCourse("Math",4)
    29. //输出
    30. println(s3.stuName + "\t" + s3.stuAge)
    31. println("*********选修课程***********")
    32. for (s <-s3.courseList) println(s.courseName + "\t" + s.credit)
    33. }
    34. }

    5、类的构造器

    类的构造器分为:主构造器、辅助构造器

    主构造器:和类的声明结合在一起,只能有一个主构造器

    Student4(val stuName:String,val stuAge:Int)

    (1) 定义类的主构造器:两个参数

    (2) 声明了两个属性:stuName和stuAge 和对应的get和set方法

    辅助构造器:可以有多个辅助构造器,通过关键字this来实现

    1. /*
    2. 类的构造器
    3. 1.主构造器:和类的声明结合在一起;只能有一个主构造器
    4. Student4(val stuName:String,var stuAge:Int)
    5. (1)定义类的主构造器:两个参数
    6. (2)声明了两个属性:stuName和stuAge 和 对应的get 和 set 方法
    7. 2.辅助构造器:可以有多个辅助构造器
    8. 通过关键字this 来实现
    9. */
    10. class Student4 (val stuName:String,val stuAge:Int) {
    11. //定义辅助构造器
    12. def this(age:Int){
    13. //调用主构造器
    14. this("no name",age)
    15. }
    16. }
    17. object Student4 {
    18. def main(args: Array[String]): Unit = {
    19. //创建Student4的一个对象
    20. var s4 = new Student4("Tom",20)
    21. println(s4.stuName + "\t" +s4.stuAge)
    22. //创建一个新的Student4 的对象
    23. var s42 = new Student4(25)
    24. println(s42.stuName + "\t" + s42.stuAge)
    25. }
    26. }

    6、Scala中的Object对象

    Scala没有静态的修饰符,但Object对象下的成员都是静态的 ,若有同名的

    class,这其作为它的伴生类。在Object中一般可以为伴生类做一些初始化等操

    作。下面是Java中的静态块的例子。在这个例子中,我们对JDBC进行了初始化:

    而Scala中的Object就相当于Java中静态块。

    在 Scala 中,是没有 static 这个东西的,但是它也为我们提供了单例模式的

    实现方法,那就是使用关键字 object。

    Scala 中使用单例模式时,除了定义的类之外,还要定义一个同名的 object 对

    象,它和类的区别是,object对象不能带参数。

    当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:

    companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为

    是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问

    其私有成员。

    Object对象的应用

    单例对象

    1. //利用object 对象实现单例模式
    2. object CreditCard {
    3. //变量保存信用卡号,这里比较好的做法,是定义成private[this],即:该属性只属于该对象,这个方法由于定义在object中,所以是静态的,即:单例的
    4. private[thisvar creditCardNumber:Long = 0
    5. //产生新的卡号
    6. def generateNewCCNumber():Long = {
    7. creditCardNumber += 1
    8. creditCardNumber
    9. }
    10. //测试程序
    11. def main(args: Array[String]): Unit = {
    12. //产生新的卡号
    13. println(CreditCard.generateNewCCNumber())
    14. println(CreditCard.generateNewCCNumber())
    15. println(CreditCard.generateNewCCNumber())
    16. println(CreditCard.generateNewCCNumber())
    17. }
    18. }

    使用应用程序对象:可以省略main方法;需要从父类App继承。

    1. //使用应用程序对象,可以省略main方法
    2. object HelloWorld extends App{
    3. /*
    4. def main(args: Array[String]): Unit = {
    5. //这里的main就可以不写。相当于下面的代码是在main方法中执行的。
    6. }
    7. */
    8. println("Hello World")
    9. ///如何取得命令行的参数
    10. if(args.length > 0) {
    11. println(args(0))
    12. }else{
    13. println("no arguents")
    14. }
    15. }

  • 相关阅读:
    国产化之虚拟ARM64-CPU安装银河麒麟操作系统
    自学(黑客技术)方法——网络安全
    成功转行软件测试感受,一个从业3年的过来人告诉你
    Android开发:Camera2+MediaRecorder录制视频后上传到阿里云VOD
    网站入门:Flask用法讲解
    【MAPBOX基础功能】08、mapbox绘制点图层并进行添加、删除、更新、显隐等操作
    双连通与网络可靠性
    kubelet证书延期
    Vue 路由使用
    Netty02 - 回显服务器实例
  • 原文地址:https://blog.csdn.net/pblh123/article/details/132624431