大数据学习14之Scala面向对象--至简原则
1.类和对象
1.1基本概念
面向对象(Object Oriented)是一种编程思想,面向对象主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想,总体来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象(万物皆对象)。
1.2特征:
对象唯一性;
抽象性(封装性);
继承性;
多态(多样);
1.3类:
类是数据结构(属性)和行为(操作)的集合,是一个抽象的概念。
包括方法和属性;
1.4对象:
类的具体实现;
面向对象的三大特征:封装、继承、多态。
1.5创建类和对象:
Scala 中创建类和对象可以通过 class 和 new 关键字来实现。用 class 创建类,用 new 创建对象。
1.6成员属性:
一个类会有自己的属性,例如:人类有姓名、年龄等。接下来我们学习如何在类中定义和访问成员属性。
1.7构造器:
当创建对象的时候,会自动调用类的构造器。
1.8单例对象:
单例对象表示全局仅有一个对象,也叫孤立对象。定义单例对象和定义类很像,就是把 class 换成 object。
1.9伴生对象:
一个 class 和 一个 object 具有相同的名字时,这个 object 就被称为伴生对象,这个 class 被称为伴生类。
2.继承
2.1语法格式
class | object A类 extends B类{ }
2.2类继承
学生类和老师类都继承人类;
2.3. 单例继承
// 定义单例对象继承父类
object Student extends Person {}
// 单例对象无需 new,直接调用属性和方法
Student.name = "李四"
Student.age = 18
Student.sayHello()
2.4. 方法重写
改写父类的方法就是方法重写。方法用ovrride标识就是说该方法是重写方法。
2.5. 类型判断
对象 . isInstanceOf[类] 判断前面的对象属不属于后面的类。
3. 抽象类
Scala 也支持定义抽象类,使用 abstract 关键字来实现。如果类中有抽象属性或者抽象方法,那么该类就是抽象类。
3.1. 语法格式
abstract class 抽象类名{
val| var 抽象属性名:类型
def 方法名(参数):返回类型
}
3.2. 抽象属性
抽象类中没有初始化值的变量就是抽象属性;
abstract class Person {
// 定义抽象属性
val name: String
// 定义抽象方法
def sayHello(): Unit
}
4. 匿名类
匿名内部类是继承了某个类的匿名的子类对象,它可以直接用来创建实例对象。Spark 的源码中大量使用了匿名内部类,学习该知识对我们查看 Spark 底层源码非常有帮助。
4.1. 语法格式
new 类名() {
// 重写父类中所有的抽象内容
}
4.2. 使用场景
当对象方法仅调用一次的时候;
作为方法的参数进行传递时。
5. 特质
在不影响当前继承体系的情况下,对某些类或者某些对象的功能进行增强。
例如:有猴子类和大象类,牠们都有姓名,年龄,以及吃的功能,但是部分猴子经过马戏团的训练后,学会了骑独轮车。如果把骑独轮车的功能定义到动物类或者猴子类中,那所有继承了该类的子类都拥有了该功能,显然是不合理的。这时就需要用到特质了,Scala 中特质的关键字为 trait 。
5.1. 特点
特质可以提高代码的复用性
特质可以提高代码的扩展性和可维护性
类与特质之间是继承关系,只不过类与类之间只支持单继承,但是类与特质之间可以多继承
特质中可以有具体的属性、抽象属性、具体的方法以及抽象方法
5.2. 语法格式
定义特质。
class 类 extends 特质1 with 特质2 {
// 重写抽象属性
// 重写抽象方法
}
继承特质。
class 类 extends 特质1 with 特质2 {
// 重写抽象属性
// 重写抽象方法
}
注意:
Scala 中不管是类还是特质,都使用继承 extends 关系,特质支持多继承;
如果要继承多个特质,则特质之间使用 with 关键字隔开。
6. 包
实际开发中,我们肯定会遇到同名的类,例如两个 Person 类,那如何在不改变类名的情况下区分它们呢?这就要使用包 package 了。
包就是文件夹的意思,用关键字 package 修饰,通过包可以区分同名的类,开发时一般将相同功能的代码放到同一个包中,以便后期维护和管理。
7. 样例类
case class 样例类名(val|var 成员属性1:类型1, 成员属性2:类型2, ...) {}
8.至简原则(重点掌握)
Scala 希望大家编写优雅的代码,所以核心思想就是能省则省,下面我们一起总结一下 Scala 的至简原则:
方法和函数不建议写 return 关键字,Scala 会使用函数体的最后一行代码作为返回值;
方法的返回值类型如果能够推断出来,那么可以省略,如果有 return 则不能省略返回值类型,必须指定;
因为函数是对象,所以函数有类型,但函数类型可以省略,Scala 编译期可以自动推断类型;
如果方法明确声明了返回值为 Unit,那么即使方法体中有 return 关键字也不起作用;
如果方法的返回值类型为 Unit,可以省略等号 = ;
如果函数的参数类型能够推断出来,那么可以省略;
如果方法体或函数体只有一行代码,可以省略花括号 {} ;
如果方法无参,但是定义时声明了 () ,调用时小括号 () 可省可不省;
如果方法无参,但是定义时没有声明 () ,调用时必须省略小括号 () ;
如果不关心名称,只关心逻辑处理,那么函数名可以省略。也就是所谓的匿名函数;
如果匿名函数只有一个参数,小括号 () 和参数类型都可以省略,没有参数或参数超过一个的情况下不能省略 () ;
如果参数只出现一次,且方法体或函数体没有嵌套使用参数,则参数可以用下划线 _ 来替代。
相关文章:

大数据学习14之Scala面向对象--至简原则
1.类和对象 1.1基本概念 面向对象(Object Oriented)是一种编程思想,面向对象主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想,总体来说面向对象的底层还是面向过程,面向过程抽象…...

docker 安装之 windows安装
文章目录 1: 在Windows安装Docker报19044版本错误的时候,请大家下载4.24.1之前的版本(含4.24.1)2: Desktop-WSL kernel version too low3: docker-compose 安装 (v2.21.0) 1: 在Windows安装Docker报19044版本错误的时候,请大家下载…...

JS 实现游戏流畅移动与按键立即响应
AWSD 按键移动 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box1 {width: 400px;height: 400px;background: yellowgreen;margin: 0 auto;position: relative;}.box2 {width: 50px;height:…...

LabVIEW大数据处理
在物联网、工业4.0和科学实验中,大数据处理需求逐年上升。LabVIEW作为一款图形化编程语言,凭借其强大的数据采集和分析能力,广泛应用于实时数据处理和控制系统中。然而,在面对大数据处理时,LabVIEW也存在一些注意事项。…...

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势
随着信息技术的快速发展和数字化时代的到来,安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者,凭借其强大的视频处理、汇聚与融合能力,展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…...

海思3403对RTSP进行目标检测
1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库,拉取RTSP流,然后调过3403的VDEC模块进行解码,送个NPU进行目标检测,输出到hdmi,这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…...

Vue之插槽(slot)
插槽是vue中的一个非常强大且灵活的功能,在写组件时,可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽,可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类:默认插槽,具名插槽和作用域插槽。 下面…...

分布式服务高可用实现:复制
分布式服务高可用实现:复制 1. 为什么需要复制 我们可以考虑如下问题: 当数据量、读取或写入负载已经超过了当前服务器的处理能力,如何实现负载均衡?希望在单台服务器出现故障时仍能继续工作,这该如何实现ÿ…...

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
摘要:车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用,不仅能帮助相关部门快速识别车辆类型,还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型,该模型使用了…...

机器学习—决定下一步做什么
现在已经看到了很多不同的学习算法,包括线性回归、逻辑回归甚至深度学习或神经网络。 关于如何构建机器学习系统的一些建议 假设你已经实现了正则化线性回归来预测房价,所以你有通常的学习算法的成本函数平方误差加上这个正则化项,但是如果…...
Java Optional详解:避免空指针异常的优雅方式
在 Java 编程中,空指针异常(NullPointerException)一直是困扰开发者的常见问题之一。为了更安全、优雅地处理可能为空的值,Java 8 引入了 Optional 类。Optional 提供了一种函数式的方式来表示一个值可能存在或不存在,…...
SpringBoot开发——整合EasyExcel实现百万级数据导入导出功能
文章目录 一、EasyExcel 框架及特性介绍二、实现步骤1、项目创建及依赖配置(pom.xml)2、项目文件结构3、配置文件(application.yml)4、启动类 Application.java5、配置类 EasyExcelConfig.java6、服务接口定义及实现 ExcelService.java7、控制器类 ExcelController.java8、…...
AcWing 1097 池塘计数 flood fill bfs搜索
代码 #include <bits/stdc.h> using namespace std;const int N 1010, M N * N;typedef pair<int, int> PII;int n, m;char g[N][N]; bool st[N][N]; PII q[M];void bfs (int xx, int yy) {int hh 0, tt -1;q[ tt] {xx, yy};st[xx][yy] true;while (hh <…...

R门 - rust第一课陈天 -内存知识学习笔记
内存 #mermaid-svg-1NFTUW33mcI2cBGB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1NFTUW33mcI2cBGB .error-icon{fill:#552222;}#mermaid-svg-1NFTUW33mcI2cBGB .error-text{fill:#552222;stroke:#552222;}#merm…...

java itext后端生成pdf导出
public CustomApiResult<String> exportPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {// 防止日志记录获取session异常request.getSession();// 设置编码格式response.setContentType("application/pdf;charsetUTF-8")…...

信号-3-信号处理
main 信号捕捉的操作 sigaction struct sigaction OS不允许信号处理方法进行嵌套:某一个信号正在被处理时,OS会自动block改信号,之后会自动恢复 同理,sigaction.sa_mask 为捕捉指定信号后临时屏蔽的表 pending什么时候清零&…...
38配置管理工具(如Ansible、Puppet、Chef)
每天五分钟学Linux | 第三十八课:配置管理工具(如Ansible、Puppet、Chef) 大家好!欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中,我们学习了如何安装和配置邮件服务器。今天,我们将探…...
网络技术-定义配置ACL规则的语法和命令
定义ACL(访问控制列表)规则时,具体命令会根据所使用的设备和操作系统而有所不同。以下是一些常见的设备和操作系统中定义ACL规则的命令示例: 一:思科(Cisco)路由器/交换机 在思科设备中&#…...

动态规划一>子数组系列
题目: 2.解析: 代码: public int maxSubArray(int[] nums) {int n nums.length;int[] dp new int[n 1];int ret Integer.MIN_VALUE;for(int i 1; i < n; i){dp[i] Math.max(nums[i - 1], dp[i - 1] nums[i - 1]);ret Math.max(…...

一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Fei Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一节我们主要来学习scanf的基本用法,了解scanf返回值,懂得scanf占位符和…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...