当前位置: 首页 > news >正文

大数据学习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和科学实验中&#xff0c;大数据处理需求逐年上升。LabVIEW作为一款图形化编程语言&#xff0c;凭借其强大的数据采集和分析能力&#xff0c;广泛应用于实时数据处理和控制系统中。然而&#xff0c;在面对大数据处理时&#xff0c;LabVIEW也存在一些注意事项。…...

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

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

海思3403对RTSP进行目标检测

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

Vue之插槽(slot)

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

分布式服务高可用实现:复制

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

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用&#xff0c;不仅能帮助相关部门快速识别车辆类型&#xff0c;还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型&#xff0c;该模型使用了…...

机器学习—决定下一步做什么

现在已经看到了很多不同的学习算法&#xff0c;包括线性回归、逻辑回归甚至深度学习或神经网络。 关于如何构建机器学习系统的一些建议 假设你已经实现了正则化线性回归来预测房价&#xff0c;所以你有通常的学习算法的成本函数平方误差加上这个正则化项&#xff0c;但是如果…...

Java Optional详解:避免空指针异常的优雅方式

在 Java 编程中&#xff0c;空指针异常&#xff08;NullPointerException&#xff09;一直是困扰开发者的常见问题之一。为了更安全、优雅地处理可能为空的值&#xff0c;Java 8 引入了 Optional 类。Optional 提供了一种函数式的方式来表示一个值可能存在或不存在&#xff0c;…...

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不允许信号处理方法进行嵌套&#xff1a;某一个信号正在被处理时&#xff0c;OS会自动block改信号&#xff0c;之后会自动恢复 同理&#xff0c;sigaction.sa_mask 为捕捉指定信号后临时屏蔽的表 pending什么时候清零&…...

38配置管理工具(如Ansible、Puppet、Chef)

每天五分钟学Linux | 第三十八课&#xff1a;配置管理工具&#xff08;如Ansible、Puppet、Chef&#xff09; 大家好&#xff01;欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中&#xff0c;我们学习了如何安装和配置邮件服务器。今天&#xff0c;我们将探…...

网络技术-定义配置ACL规则的语法和命令

定义ACL&#xff08;访问控制列表&#xff09;规则时&#xff0c;具体命令会根据所使用的设备和操作系统而有所不同。以下是一些常见的设备和操作系统中定义ACL规则的命令示例&#xff1a; 一&#xff1a;思科&#xff08;Cisco&#xff09;路由器/交换机 在思科设备中&#…...

动态规划一>子数组系列

题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; 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函数

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Fei Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。* 这一节我们主要来学习scanf的基本用法&#xff0c;了解scanf返回值&#xff0c;懂得scanf占位符和…...

Altium Designer使用技巧(五)

一、敷铜(快捷键T-G-A) 1、工具栏点“设计”—>“规则”。 可以修改覆铜连线的宽度&#xff0c;也可以选择“直接连接”使得铜和网络节点完全相连。 这里方式有三种&#xff0c;可根据需要各个人习惯去设置。 2、敷铜与线全链接 &#xff08;1&#xff09;少量的话可右键“…...

Docker 的安装与使用

Docker 的安装 Docker 是一个开源的商业产品&#xff0c;有两个版本&#xff1a;社区版&#xff08;Community Edition&#xff0c;缩写为 CE&#xff09;和企业版&#xff08;Enterprise Edition&#xff0c;缩写为 EE&#xff09;。 Docker CE 的安装请参考官方文档&#xf…...

Android Studio 中三方库依赖无法找到的解决方案

目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近&#xff0c;我在编译一个 Android 老项目时遇到了一个问题&#xff0c;错误信息显示无法找到 com.gyf.immersionba…...

PGMP练-DAY24

DAY241A program has completed and closed. The training for the receiving organization has also delivered. But the stakeholders still concern that the benefits cannot be realized in long term.What does the program manager review to improve the situation?项…...

【C++动态规划 最长公共子序列】1035. 不相交的线|1805

本文涉及知识点 C动态规划 LeetCode1035. 不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j] 且绘制的…...

FFmpeg的基本结构

FFmpeg框架可以简单分为两层&#xff0c;上层是以ffmpeg、ffplay、ffprobe为代表的命令行工具&#xff1b;其底层支撑是一些基础库&#xff0c;包含AVFormat、AVCodec、AVFilter、AVDevices、AVUtils等模块库。 常用函数如下&#xff1a; 1. AVFormat 封装/解封装模块 avf…...

react 受控组件和非受控组件

在 React 中&#xff0c;受控组件和非受控组件是两种处理表单元素&#xff08;如输入框、选择框等&#xff09;值的方式。 1. 受控组件 受控组件是指 React 组件的表单元素的值是由 React 组件的 state 来管理的。换句话说&#xff0c;React 会全程控制表单元素的值&#xff…...

C语言模块化概述

一、函数名的意义 1.c语言是一门面向过程的语言&#xff1a;所谓的过程就是动词&#xff0c;动作。 功能块动词1动词2……动词 2.功能块&#xff1a;就是一堆动词&#xff08;动作&#xff09;的组合&#xff0c;动作通过函数来实现。 3.函数的功能&#xff1a;承上启下 承…...

WPF 中的视觉层和逻辑层有什么区别?

在 WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;视觉层和逻辑层是两个不同的概念&#xff0c;它们分别涉及到界面的展示和应用的行为。要理解这两个层次的区别&#xff0c;我们需要从 WPF 的设计背景、架构以及它们之间的相互关系来全面分析。 …...

Kafka简单实践

使用 Apache Kafka 和 Swoole 的 PHP 实践案例 一、引言 Apache Kafka 是一个开源的分布式流处理平台&#xff0c;能够处理大量的实时数据流。由于其高吞吐量、可扩展性和持久性&#xff0c;Kafka 成为构建微服务架构和大数据处理的重要工具。Swoole 是一个高性能的异步网络通…...