大数据技术——面向对象编程基础

news2024/9/22 7:30:46

类的定义

字段定义:用val或var关键字进行定义

方法定义:

使用new关键字创建一个类的实例

类成员可见性

Scala类中所有成员的默认可见性为公有,任何作用域内都能直接访问公有成员

除了默认的公有可见性,Scala也提供private和protected

其中,private成员只对本类型和嵌套类型可见;protected成员对本类型和其继承类型都可见

为了避免直接暴露public字段,建议将字段设置为private,对于private字段,Scala采用类似Java中的getter和setter方法,定义了两个成对的方法value和value_=进行读取和修改

Scala语法中有如下规范,当编译器看到以value和value_=这种成对形式出现的方法时,它允许用户去掉下划线_,而采用类似赋值表达式的形式

方法的定义方式

基本语法:

  • 方法参数前不能加.上val或var,所有的方法参数都是不可变类型

  • 无参数的方法定义时可以省略括号,这时调用时也不能带有括号;如果

定义时带有括号,则调用时可以带括号,也可以不带括号

  • 方法名后面的圆括号()可以用大括号{}来代替

  • 如果方法只有一个参数,可以省略点号(.)而采用中缀操作符调用方法

  • 如果方法体只有一条语句,可以省略方法体两边的大括号

当方法的返回结果类型可以从最后的表达式推断出时,可以省略结果类型

如果方法返回类型为Unit,可以同时省略返回结果类型和等号,但不能省略大括号

构造器

Scala类的定义主体就是类的构造器,称为主构造器。在类名之后用圆括号列出主构造器的参数列表

主构造器的参数前可以使用val或var关键字

Scala内部将自动为这些参数创建私有字段,并提供对应的访问方法

·如果不希望将构造器参数成为类的字段,只需要省略关键字var或者val

Scala类可以包含零个或多个辅助构造器(( auxiliaryconstructor) 。

辅助构造器使用this进行定义,this的返回类型为Unit

每个辅助构造器的第一个表达式必须是调用一个此前已经定义的辅助构造器或主构造器,调用的形式为“this(参数列表)”

对象

单例对象

Scala采用单例对象( singleton object)来实现与Java静态成员同样的功能

使用object关键字定义单例对象

单例对象的使用与一个普通的类实例一样:

伴生对象和孤立对象

当一个单例对象和它的同名类一起出现时,这时的单例对象被称为这个同名类的“伴生对象”(companionobject)相应的类被称为这个单例对象的“伴生类”。

类和它的伴生对象必须存在于同一个文件中,可以相互访问私有成员

没有同名类的单例对象,被称为孤立对象(standaloneobject)。

一般情况下,Scala程序的入口点main方法就是定义在一个孤立对象里

apply方法

思考下行代码的执行过程:

Scala自动调用Array类的伴生对象Array中的一个称为apply的方法,来创建一个Array对象myStrArr

apply方法调用约定:用括号传递给类实例或单例对象名一个或多个参数时,Scala会在相应的类或对象中查找方法名为apply且参数列表与传入的参数一致的方法,并用传入的参数来调用该apply方法

伴生对象中的apply方法:将所有类的构造方法以apply方法的形式定义在伴生对象中,这样伴生对象就像生成类实例的工厂,而这些apply方法也被称为工厂方法

为什么要设计apply方法?

  1. 保持对象和函数之间使用的一致性

  1. 面向对象:“对象.方法”VS 数学:“函数(参数)”

  1. Scala中一切都是对象,包括函数也是对象。Scala中的函数既保留括号调用样式,也可以使用点号调用形式,其对应的方法名即为apply

为什么要设计apply方法?

Scala的对象也可以看成函数,前提是该对象提供了apply方法

update方法

与apply方法类似的update方法也遵循相应的调用约定:

当对带有括号并包括一到若干参数的对象进行赋值时,编译器将调用对象的update方法,并将括号里的参数和等号右边的值一起作为update方法的输入参数来执行调用

unapply方法

·unapply方法用于对对象进行解构操作,与apply方法类似,该方法也会被自动调用

·可以认为unapply方法是apply方法的反向操作,apply方法接受构造参数变成对象,而unapply方法接受一个对象,从中提取值

继承

抽象类

如果一个类包含没有实现的成员,则必须使用abstract关键词进行修饰,定义为抽象类

关于上面的定义,说明几点:

(1)定义一个抽象类,需要使用关键字abstract

(2)定义一个抽象类的抽象方法,不需要关键字abstract,只要把方法体空着,不写方法体就可以

(3)抽象类中定义的字段,只要没有给出初始化值,就表示是一个抽象字段,但是,抽象字段必须要声明类型,否则编译会报错

扩展类

Scala只支持单一继承,而不支持多重继承。在类定义中使用extends关键字表示继承关系。定义子类时,需要注意:

  1. 重载父类的抽象成员(包括字段和方法)时,override关键字是可选的;而重载父类的非抽象成员时,override关键字是必选的

  1. 只能重载val类型的字段,而不能重载var类型的字段。因为var类型本身就是可变的,所以,可以直接修改它的值,无需重载

Scala的类层次结构

Null是所有引用类型的子类,其唯一的实例为null,表示一个“空”对象,可以赋值给任何引用类型的变量,但不能赋值给值类型的变量

Nothing是所有其它类型的子类,包括Null。Nothing没有实例,主要用于异常处理函数的返回类型

Option类

  • Scala提供null是为了实现在JVM与其它Java库的兼容性,但是,除非明确需要与Java库进行交互,否则,Scala建议尽量避免使用这种可能带来bug的null,而改用Option类

  • Option是一个抽象类。有一个具体的子类Some和一个对象None,其中,前者表示有值的情形,后者表示没有值

  • 当方法不确定是否有对象返回时,可以让返回值类型为Option[T],其中,T为类型参数。对于这类方法,如果确实有T类型的对象需要返回,会将该对象包装成一个Some对象并返回;如果没有值需要返回,将返回None

特质

特质概述

  • Java中提供了接口,允许一个类实现任意数量的接口

  • Scala中没有接口的概念,而是提供了“特质(trait)”,它不仅实现了接口的功能,还具备了很多其他的特性

  • Scala的特质是代码重用的基本单元,可以同时拥有抽象方法和具体方法

  • Scala中,一个类只能继承自一个超类,却可以实现多个特质,从而重用特质中的方法和字段,实现了多重继承

特质的定义

使用关键字trait定义特质

特质既可以包含抽象成员,也可以包含非抽象成员。包含抽象成员时,不需要abstract关键字

特质可以使用extends继承其它的特质

把特质混入类中

可以使用extends或with关键字把特质混入类中

如果特质中包含抽象成员,则该类必须为这些抽象成员提供具体实现,除非该类被定义为抽象类

把上面定义的特质Flyable和类Bird封装到一个代码文件Bird.scala中:

在Scala REPL中执行如下代码并观察效果:

如果要混入多个特质,可以连续使用多个with

可以在Scala REPL中执行如下代码查看执行效果:

模式匹配

match语句

最常见的模式匹配是match语句,match语句用在当需要从多个分支中进行选择的场景

通配符_相当于Java中的default分支

match结构中不需要break语句来跳出判断,Scala从前往后匹配到一个分支后,会自动跳出判断

case后面的表达式可以是任何类型的常量,而不要求是整数类型

除了匹配特定的常量,还能匹配某种类型的所有值

可以在match表达式的case中使用守卫式(guard)添加一些过滤逻辑

case类

  • case类是一种特殊的类,它们经过优化以被用于模式匹配

  • 当定义一个类时,如果在class关键字前加上case关键字,则该类称为case类

  • Scala为case类自动重载了许多实用的方法,包括toString、equals和hashcode方法

  • Scala为每一个case类自动生成一个伴生对象,其包括模板代码

- 1个apply方法,因此,实例化case类的时候无需使用new关键字-1个unapply方法,该方法包含一个类型为伴生类的参数,返回的结果是Option类型,对应的类型参数是N元组,N是伴生类中主构造器参数的个数。

Unapply方法用于对对象进行解构操作,在case类模式匹配中,该方法被自动调用,并将待匹配的对象作为参数传递给它

例如,假设有如下定义的一个case类:

则编译器自动生成的伴生对象是:

包的定义

为了解决程序中命名冲突问题,Scala也和Java一样采用包(package)来层次化、模块化地组织程序

为了在任意位置访问MyClass类,需要使用autodepartment.MyClass

通过在关键字package后面加大括号,可以将程序的不同部分放在不同的包里。这样可以实现包的嵌套,相应的作用域也是嵌套的

引用包成员

可以用import子句来引用包成员,这样可以简化包成员的访问方式

使用通配符下划线(_)引入类或对象的所有成员

Scala隐式地添加了一些引用到每个程序前面,相当于每个Scala程序都隐式地以如下代码开始:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

真涨脸,我用 Python 为朋友自动化整理表格

今天,在工作的时候,我的美女同事问我有没有办法自动生成一个这样的表格: 第一列是院校科目,第二列是年份,第三列是数量。 这张表格是基于这一文件夹填充的,之前要一个文件夹一个文件夹打开然后手动填写年份…

测牛学堂:软件测试python之unittest框架总结(3)

python之unittest添加整个测试类执行 如果我们的测试用例比较多的话,测试套件对象通过addTest一个一个添加比较麻烦,可以通过添加一个类的方法, 去执行这个类里面的所有测试方法 套件对象.addTest(unittest.makeSuite(测试类名)) import un…

“终于我从字节离职了...“一个年薪50W的测试工程师的自白...

我递上了我的辞职信,不是因为公司给的不多,也不是因为公司待我不好,但是我觉得,我每天看中我憔悴的面容,每天晚上拖着疲惫的身体躺在床上,我都不知道人生的意义,是赚钱吗?是为了更好…

3.2滑动窗口

滑动窗口*** 题目链接 视频讲解 属于单调队列的模板题 如果每次移动窗口,然后在窗口中循环遍历查找最大值,时间复杂度太高 解决思路: 维护一个单调队列,其中head永远指的是当前窗口中最大的值,从head到tail元素递减。…

【Unity VR开发】结合VRTK4.0:创建圆盘

语录: 茶若相似,味不必如一。但凡茗茶,一泡苦涩,二泡甘香,三泡浓沉,四泡清洌,五泡清淡,此后,再好的茶也索然无味。诚似人生五种,年少青涩,青春芳…

【并发基础】Java中线程的创建和运行以及相关源码分析

目录 一、线程的创建和运行 1.1 创建和运行线程的三种方法 1.2 三者之间的继承关系 二、Thread类和Runnable接口的区别 2.1 Runnable接口可以实现线程之间资源共享,而Thread类不能 2.2 实现Runnable接口相对于继承Thread类的优点 三、实现 Runnable 接口和实现 Call…

【python学习笔记】:Excel 数据的封装函数

对比其它编程语言,我们都知道Python最大的优势是代码简单,有丰富的第三方开源库供开发者使用。伴随着近几年数据分析的热度,Python也成为最受欢迎的编程语言之一。而对于数据的读取和存储,对于普通人来讲,除了数据库之…

程序员推荐的良心网站合集!(第二期)

今天来给大家推荐几个程序员必看的国外良心网站合集第二期合集。 Semantic Schoolar 由微软联合创始人Paul Allen开发的免费学术搜索引擎,不仅可以通过时间线快速定位想要的文献,还有强大的筛选功能可以精准的找到自己想要的文献,想要什么搜…

服务器部署

文章目录目录前言1、前端服务器选型1.1、Nginx1.1.1、Nginx介绍1.1.2、正向代理&反向代理1、正向代理2、反向代理1.1.3、优点1、支持高并发2、内存消耗少3、成本低廉4、配置文件非常简单5、支持Rewrite重写6、内置的健康检查功能7、节省带宽8、稳定性高9、支持热部署1.2、N…

[oeasy]python0098_个人计算机浪潮_IBM5100_微软成立_苹果II_VisCalc

个人计算机浪潮 回忆上次内容 个人电脑(PC) 在爱好者之间疯传 人人都有一台计算机 从attair-8800到apple-1个人电脑 离普通人 更近了 如果 人人都有 自己的电脑 谁还去 用终端连接大型机 呢? IBM真的被干掉了吗?🤔 时代背景 计算机 逐渐…

JVM 全面了解

JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载器)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆&#xf…

数据分析-深度学习 NLP Day3句法分析

第六章句法分析在本章中,你将学到与句法分析相关的一些算法和技术 。 很多技术手段可以用来实 现句法分析,包括基于规则的和基于统计的,在本章中读者将会了解其基本原理和使用方法 。本章要点主要如下:句法分析及其难点句法分析相…

高分子PEG,Biotin-PEG-amine,Biotin-PEG-NH2,生物素-聚乙二醇-氨基

Biotin-PEG-amine, Biotin-PEG-NH2 | 生物素-聚乙二醇-氨基 | CAS:N/A | 纯度:95%一、试剂信息:CAS号:N/A外观:固体/粉末分子量:1K、2K、5K、3.4K、10K、20K溶解性:溶于有机溶剂&…

WebRTC GCC拥塞控制算法详解

1、WebRTC版本m742、GCC的概念GCC全称Google Congest Control,所谓拥塞控制,就是控制数据发送的速率避免网络的拥塞。可以对比TCP的拥塞控制算法,由于WebRTC使用基于UDP的RTP来传输媒体数据,需要一个拥塞控制算法来保证基本的Qos。…

SLM27211 集成自举二极管的4A,120V高低边栅极驱动器

SLM27211是一款集成了自举二极管的120V的耐压的,支持高频率大电流(4A)输出的栅极驱动器。可以缩短栅极电压上升时间、下降时间。它可以在8V至20V下驱动高低MOSFET。产品以集新技术、新工艺、新成果为一体,可安全高效地应用于多类模…

【音视频安卓开发 (十一)】jni基础

要使用jni开发需要包含jni.h头文件JNIEXPORT JNI : 是一个关键字,不能少(编译能通过),标记为该方法可以被外部调用jstring : 代表java中的stringJNICALL: 也是一个关键字,可以少的jni callJNIENV : 这是c和java相互调用…

学习笔记-架构的演进之服务容错策略设计模式-3月day02

文章目录前言断路器模式舱壁隔离模式重试模式总结附前言 容错设计模式,指的是“要实现某种容错策略,我们该如何去做”。微服务中常见的设计模式包括断路器模式、舱壁隔离模式和超时重试模式等,另外还有流量控制模式等。 断路器模式 断路器…

VSCode——SSH免密登录

文章目录本地PC端(一般为Windows)1. 检查自己是否已经生成公钥2. 配置VScode的SSH config远程服务器端1. 服务器新建授权文件2. 赋权限3. 重启远程服务器的ssh服务最全步骤:【设置ssh免密不起作用?彻底搞懂密钥】vscode在remote S…

linux常用命令介绍 05 篇——实际应用篇(用 cut、uniq等统计文档里每个关键词出现的次数)

linux常用命令介绍 05 篇——实际应用篇(用 cut、uniq等统计文档里每个关键词出现的次数)1. 先导文章——关于行过滤 和 列截取2. 关于单个统计单词个数2.1 grep2.2 wc3. 统计文档中每个关键词出现的次数3.1 先看文档内容 需求3.1.1 文档内容3.1.2 需求…

系列十、锁

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问…