Scala学习笔记7: 对象
目录
- 第七章 对象
- 1- 单例对象
- 2- 伴生对象
- 3- 扩展类或特质的对象
- 4- apply方法
- 5- 应用程序对象
- 6- 枚举
- end
第七章 对象
在Scala中, 对象(Obiect) 是一个单例实例, 类似于 Java中的单例模式 ;
Scala中的对象使用 object
关键字定义, 它可以包含字段、方法、初始化代码和嵌套的类或对象 ;
对象在第一次被访问时被实例化, 并且在整个程序的生命周期中只有一个实例 .
1- 单例对象
在Scala中, 单例对象(Singleton Object) 是指只有一个实例的对象, 类似于Java中的静态类 ;
单例对象在Scala中被广泛用于实现全局共享的实例或提供工具函数 ;
-
定义单例对象:
- 在Scala中, 使用
object
关键字定义单例对象 - 单例对象中的方法和字段可以直接通过对象名访问, 无需实例化对象
- 在Scala中, 使用
-
示例代码
-
// 单例对象 object MySingleton {def greet(): Unit = {println("Hello from Singleton Object!")}val number = 42 }
-
// 调用单例对象的方法和字段MySingleton.greet() // 输出: Hello from Singleton Object!println(MySingleton.number) // 输出: 42
-
-
示例解释:
- 在上面的示例中,
MySingleton
是一个单例对象, 包含一个greet
方法和一个number
字段 - 可以直接通过
MySingleton
对象名访问greet
方法和number
字段, 无需创建对象实例
- 在上面的示例中,
-
单例对象的特点:
- 单例对象在程序运行期间只有一个实例, 可以用于共享状态或提供全局访问点
- 单例对象可以包含静态方法、常量、工具函数等, 方便在整个应用程序中使用
通过单例对象, 你可以实现全局共享的实例或提供全局访问点, 避免创建多个实例造成资源浪费 ;
2- 伴生对象
在Scala中, 伴生对象 (Companion Object) 是一个与类同名的对象, 用于扩展类的功能并提供类级别的操作 ;
伴生对象与伴生类 (Companion Class) 一起工作, 可以互相访问对方的私有成员 ;
-
定义伴生对象:
- 在Scala中, 通过在类名相同的对象中定义静态方法和成员来创建伴生对象
- 伴生对象通常用于存放类级别的方法、常量或工具函数
-
示例代码
-
class Person(val name: String, val age: Int)object Person {def apply(name: String, age: Int): Person = new Person(name, age)def displayInfo(person: Person): Unit = {println(s"Name: ${person.name}, Age: ${person.age}")} }
-
// 创建 Person 类的实例val person = new Person("John", 30)// 调用伴生对象的方法Person.displayInfo(person) // 输出:Name: John, Age: 30
-
-
示例解释
- 在上面的示例中,
Person
类有一个伴生对象Person
- 伴生对象中定义了一个
apply
方法用于创建Person
类的实例, 以及一个displayInfo
方法用于显示Person
对象的信息 - 可以直接通过
Person
对象名调用伴生对象的方法, 无需创建对象实例
- 在上面的示例中,
-
伴生对象的特点
- 伴生对象与伴生类共享相同的名称, 可以相互访问对方的私有成员
- 伴生对象通常用于定义类级别的方法, 共享方法或共享常量
通过伴生对象, 你可以在Scala中实现类级别的操作和共享的功能, 提供高代码的可维护性和灵活性;
伴生对象是Scala中面向对象编程的重要特性之一, 为类的扩展和功能提供了便利 .
3- 扩展类或特质的对象
在Scala中, 要扩展类或特质的对象, 可以使用匿名类或匿名特质的方式来实现 ;
通过扩展类或特质的对象, 可以在不修改原始类或特质的情况下, 为其添加额外的功能或行为 ;
代码示例:
// 定义一个简单的类和特质class Person(val name: String) {def greet(): Unit = println(s"Hello, my name is $name")}trait Programmer {def code(): Unit = println("Coding...")}
// 创建一个Person对象并扩展其功能val person = new Person("John") with Programmer {override def greet(): Unit = {super.greet()println("I am also a programmer.")}}// 调用扩展后的功能person.greet() // 输出:Hello, my name is John / I am also a programmer.person.code() // 输出:Coding...
- 在上面的示例中, 我们创建了一个
Person
类和一个Programmer
特质 ; - 然后, 我们使用匿名类的方式为
Person
对象扩展了Programmer
特质的功能 ; - 通过重写
greet
方法并调用super.greet()
, 我们实现了在原始Person
类的基础上添加了额外的行为 ; - 最后, 我们创建了扩展后的
Person
对象person
, 并调用了扩展后的功能 .
通过这种方式, 你可以灵活地扩展类或特质的对象, 使其具有更多的功能和行为, 同时保持原始类或特质的不变性 ;
4- apply方法
在Scala中, apply
方法是一个特殊的方法, 可以让对象像函数一样被调用 ;
当对象被调用是, 实际上是调用了 apply
方法 ;
这种机制使得对象可以具有函数的行为, 增强了代码的灵活性和可读性 .
示例:
// 定义一个类并实现apply方法class MyAdder(x: Int) {def apply(y: Int): Int = {x + y}}
// 创建对象val adder = new MyAdder(10)// 调用对象实际上是调用apply方法val result = adder(20)println(result) // 输出: 30
- 在上面的示例中, 我们定义了一个
MyAdder
类, 并实现了apply
方法, 使得类的实例可以像函数一样被调用 ; - 当我们使用
adder(20)
时, 实际上是调用了apply
方法, 计算出结果 ;
通过 apply
方法, Scala中的对象对象可以具有函数的特性, 使得代码更加简洁和直观 ;
这种机制在实际开发中经常用于共享方法、DSL(领域特定语言) 等场景, 提高了代码的可读性和易用性 .
5- 应用程序对象
在Scala中, 应用程序对象 (Application Object) 是一个特殊的对象, 用于作为Scala应用程序的入口点 ;
应用程序对象可以简化应用程序的启动过程, 无需显式定义 main
方法, 而是通过继承 App
特质或直接编写代码来定义应用程序的入口逻辑 ;
应用程序对象通常具有以下特点和用法:
继承App特质
: 通过继承App
特质, 应用程序对象可以直接编写应用程序的逻辑代码, 无需显式定义main
方法 ; 这样可以简化应用程序的入口定义 .自动执行代码
: 当运行Scala应用程序时, Scala编译器会自动查找继承自App
特质的对象, 并执行其中的代码 ; 这使得应用程序对象称为程序的入口点 .简化入口定义
: 应用程序对象简化了应用程序的入口定义, 使得代码更加简洁和易于理解 ; 开发人员可以专注于编写应用程序的逻辑, 而无需关注入口点的细节 .
object Hello {def main(args: Array[String]): Unit = {println("Hello, world!") // 输出: Hello, world!}
}
// 使用 应用程序对象
object MyApp extends App {println("Hello World!") // 输出: Hello World!
}
- 在上面的示例中,
MyAPP
是一个继承自App
特质的应用程序对象, 其中包含了一个简单的打印语句 ; - 当运行这个应用程序时, Scala编译器会自动执行
MyApp
对象中的代码 ;
通过应用程序对象, Scala开发人员可以更加便捷地编写和运行应用程序, 简化了入口点的定义, 提高了代码的可读性和易用性 .
6- 枚举
在Scala中虽然没有内置的枚举类型, 但是可以使用 Enumeration
助手类来生产枚举 ;
Enumeration
类允许定义一组枚举值, 并为每个枚举值分配一个唯一的整数值 ;
示例:
object Weekday extends Enumeration {type Weekday = Valueval Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday = Value
}
import Weekday._val today = Mondayif (today == Saturday || today == Sunday) {println("Today is a weekend!")} else {println("Today is a weekday.")}
- 在上面的示例中, 我们定义了一个名为
Weekday
的枚举, 通过继承Enumeration
类来创建 ; - 我们列举了一周的每一天作为枚举值, 并为每个值分配了一个唯一的整数值 ;
- 然后我们导入枚举值, 并使用他们来表示今天是星期几, 并根据是工作日还是周末进行打印输出 .
通过使用 Enumeration
助手类, 你可以方便地定义和使用枚举, 使得代码更加清晰和易于理解 ;
end
相关文章:
Scala学习笔记7: 对象
目录 第七章 对象1- 单例对象2- 伴生对象3- 扩展类或特质的对象4- apply方法5- 应用程序对象6- 枚举end 第七章 对象 在Scala中, 对象(Obiect) 是一个单例实例, 类似于 Java中的单例模式 ; Scala中的对象使用 object 关键字定义, 它可以包含字段、方法、初始化代码和嵌套的类…...

【Linux】进程切换环境变量
目录 一.进程切换 1.进程特性 2.进程切换 1.进程切换的现象 2.如何实现 3.现实例子 2.环境变量 一.基本概念 二.常见环境变量 三.查询常见环境变量的方法 四.和环境变量相关的命令 五.环境变量表的组织方式 六.使用系统调用接口方式查询环境变量 1.getenv 2.反思 …...

嵌入式学习记录6.6(拷贝构造/友元函数/常成员函数)
一.拷贝构造函数和拷贝赋值函数 1.1拷贝构造函数功能,格式 拷贝构造函数是一种特殊的构造函数,用来将一个类对象给另一个类对象初始化使用的。 1> 用一个类对象给另一个类对象初始化时,会自动调用拷贝构造函数。 2> 当一个类对作为函数的实参&…...

宝塔 nginx 配置负载均衡 upstream
nginx 主配置文件加入 upstream myapp1 {server 192.168.124.101:5051;server 192.168.124.102:5052;server 192.168.124.111:5050;}站点配置文件中加入 location / {proxy_pass http://myapp1;}80端口映射到外网域名配置方法 加入红框中的代码 upstream myapp3 {server 192.16…...
idea 插件推荐
idea 插件推荐 RESTFul-Tool 接口搜索Show Comment 代码注释展示translation 翻译(注释翻译)MyBatisCodeHelperPro 日志封装sql xml跳转GitToolBox 展示GIT提交Jenkins Control idea jenkins 集成Gitmoji Plus: Commit Button GIT提交moji表情 RESTFul-Tool 接口搜索 https://…...

【Linux】Linux环境基础开发工具_5
文章目录 四、Linux环境基础开发工具Linux小程序---进度条git 未完待续 四、Linux环境基础开发工具 Linux小程序—进度条 上篇我们实现了一个简易的进度条,不过那仅仅是测试,接下来我们真正的正式实现一个进度条。 接着编写 processbar.c 文件 然…...

Java Web学习笔记15——DOM对象
DOM: 概念:Document Object Model: 文档对象模型 将标记语言的各个组成部分封装为对应的对象: Document: 整个文档对象 Element:元素对象 Attribute: 属性对象 Text:文本对象 Comment&a…...

中电联系列一:rocket手把手教你理解中电联协议!
分享《一套免费开源充电桩物联网系统,是可以立马拿去商用的!》 第1部分:总则 Charging and battery swap service information exchange for electric vehicles Part 1:General 前 言 T/CEC102—2016《 电动汽车充换电服务信息交换》分为四…...

(面试官问我微服务与naocs的使用我回答了如下,面试官让我回去等通知)微服务拆分与nacos的配置使用
微服务架构 正常的小项目就是所有的功能集成在一个模块中,这样代码之间不仅非常耦合,而且修改处理的时候也非常的麻烦,应对高并发时也不好处理,所以 我们可以使用微服务架构,对项目进行模块之间的拆分,每一…...

冯喜运:6.7今日黄金原油行情分析及独家操作策略
【黄金消息面分析】:周三(6月5日),金价回升逾1.2%,收盘报每盎司2,355.49美元,全面收复前一交易日的跌幅。周三当天前公布的美国民间就业数据弱于预期,增强了美联储将在今年晚些时候降息的预期&a…...

Android 蓝牙概述
一、什么是蓝牙 蓝牙是一种短距离(一般10m内)无线通信技术。蓝牙技术允许固定和移动设备在不需要电缆的情况下进行通信和数据传输。 “蓝牙”这名称来自10世纪的丹麦国王哈拉尔德(Harald Gormsson)的外号。出身海盗家庭的哈拉尔德统一了北欧四分五裂的国…...
Python3 笔记:字符串的 find()、rfind()、index()、rindex()
1、find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中…...

【研发日记】Matlab/Simulink软件优化(二)——通信负载柔性均衡算法
文章目录 前言 背景介绍 初始代码 优化代码 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink软件优化(一)——动态内存负荷压缩》 背景介绍 在一个嵌入式软件开发项目中,需要设计一个ECU节点的CAN网路数据发送,需求是在500k的通信波特率上&a…...
Python 设计模式(行为型)
文章目录 策略模式场景示例 迭代器模式场景示例 访问者模式场景示例 观察者模式场景示例 命令模式场景示例 模板方法模式场景示例 模板方法模式场景示例 事件驱动模式场景示例 责任链模式场景示例 中介者模式场景示例 状态模式场景示例 策略模式 策略模式(Strategy…...

电商API商品数据采集接口||助力电商企业采集商品大数据提高开发效率
提高开发效率:电商API接口允许不同的应用程序之间高效地进行交互,节省了大量的人力物力成本,使得开发者可以将更多时间和精力集中于自身的核心业务。 增加数据安全性:通过对数据进行安全加密,API接口实现了对数据的保护…...
Day34 事件聚合器实现消息过滤功能
当前章节,实现了消息事件过滤功能 在上一章节中,我们发现在Login视图页和Main视图页都使用了同一个事件聚合器,导致在Login视图页发送的消息也被Main 视图主页所接收,这违反了事件传递的意图和模块化设计的原则。为了解决这个问题,我们需要为事件聚合器引入消息过滤的…...
前端 JS 经典:Reflect 本质
1. 什么是 Reflect Reflect 可以调用对象的基本方法(内部方法),在 ES6 之前我们是没有任何方法去直接调用对象的基本方法的。只能间接调用,间接调用它又会给你做一些额外得事。 2. 对象的基本方法 什么是对象的基本方法呢&…...
accelerate 的一个tip:early stopping 处可能存在的bug
在分布式训练中进行提前停止时,如果每个进程都有特定的停止条件(例如验证损失),这可能不会在所有进程中同步。 因此,可能在进程 0 中发生中断,而进程 1 则不会——>这将导致代码无限期挂起,直…...

企业数据挖掘建模平台极简建模流程
泰迪智能科技企业数据挖掘建模平台是企业自主研发,面向企业级用户的快速数据处理构建模型工具。平台底层算法基于R语言、Python、Spark等引擎,使用JAVA语言开发,采用 B/S 结构,用户无需下载客户端,可直接通过浏览器进…...

使用pkg打包了一个使用了sqlite3的nodejs项目,启动后闪退
从截图来看,问题出在 sqlite3 模块上。说明在打包过程中,sqlite3 模块的 .node 文件没有正确加载。 紧急解决方法: 其实就是exe文件还需要node_modules中的sqlite3 依赖,我们直接在系统顶级放一个node_modules,且其中只…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...