Scala学习笔记6: 类
目录
- 第六章 类
- 1- 简单类和无参方法
- 2- 带有getter和setter的属性
- 3- 只带getter的属性
- 4- 对象私有化
- 5- 辅助构造器
- 6- 主构造器
- 7- 嵌套类
- end
第六章 类
在Scala中, 类用于创建对象的蓝图;
类可以包含方法、值、变量、类型、对象和特质等成员;
类名应该以大写字母开头, 可以包含构造函数、主题和方法等
可以使用class
关键字定义类, 并使用new
关键字实例化类;
1- 简单类和无参方法
定义简单类
: 使用关键字class
定义一个简单类:
// 定义一个简单的类class Person {// 类体def greet(): Unit = {println("Hello, world!")}}// 创建类的实例val person = new Person()person.greet() // 调用类中的方法 输出 "Hello, world!"
// 定义一个简单的Point类class Point(val x: Int, val y: Int) {// 类体: 定义一个方法,返回一个Point对象def move(dx: Int, dy: Int): Point = {new Point(x + dx, y + dy)}override def toString: String = {s"($x, $y)"}}// 创建一个Point类的实例val p = new Point(1, 2)println(p) // 输出: (1,2)println(p.x) // 输出: 1println(p.move(2, 3)) // 输出: (3,5)println(p.move(2, 3).move(1, 2)) // 输出: (4,7)
无参方法
: 在Scala中, 你可以定义不带参数的方法; 方法可以包含方法体和返回类型;
// 无参方法class Calculator {def add(): Int = {val a = 10val b = 20a + b}}// 创建类的实例val calculator = new Calculator()val result = calculator.add()println(result) // 输出: 30
2- 带有getter和setter的属性
在Scala中, 你可以使用带有getter
和 setter
的属性来定义类的成员变量;
这些属性允许你控制对类成员的访问和修改;
class Person {// 私有成员变量, 带有 getter 和 setter 方法private var _name: String = "Alice"// getter方法def name: String = _name// setter方法def name_=(newName: String): Unit = {if (newName.nonEmpty) {_name = newName}}}// 创建Person类的示例 对象val person = new Person()// 使用getter获取属性值println(person.name) // 输出: Alice// 使用setter设置属性值person.name = "Bob"println(person.name) // 输出: Bob// 尝试设置空字符串, 不会修改属性值person.name = ""println(person.name) // 输出: Bob
上面示例中, 定义了一个 Person
类, 其中 _name
是一个私有的成员变量;
通过定义name
和 name_=
方法, 实现了属性 name
的 getter 和 setter ;
在示例化 Person
类后, 我们可以使用getter 获取属性值, 使用 setter 设置新的属性值;
在 setter中, 添加了条件来确保新值非空 ;
通过使用带有 getter
和 setter
的属性, 可以更灵活地控制类成员的访问和修改;
3- 只带getter的属性
在Scala中, 你可以创建只带getter
而没有setter
的属性, 这意味着这些属性只能被读取而无法被修改;
这种属性通常用于表示只读数据或计算得出的值;
示例:
class Person {// 私有成员变量, 只带getterprivate var _age: Int = 26// 只带getter的属性def age: Int = _age}
// 创建Person类的实例 对象val p = new Person// 使用getter获取属性值println(p.age) // 输出: 26// 尝试修改 只带 getter的属性, 会导致编译错误// p.age = 27 // 编译错误: Reassignment to val
在上面的示例中, 我们定义了一个 Person
类, 其中 _age
是一个私有的成员变量;
通过定义age
方法, 我们实现了只带 getter
的属性;
在实例化Person
类后, 我们无法使用 setter
来修改 age
属性, 只能使用 getter
来获取属性值;
通过创建只带 getter
的属性, 您可以确保某些属性在对象创建后不会被意外修改, 从而增加代码的安全性和可靠性;
4- 对象私有化
在Scala中, 你可以使用 private[this]
来定义对象私有化的成员变量或方法;
对象私有化意味着只有同一个对象内部的其他成员才能访问这些私有成员, 而其它对象无法访问;
这种私有化级别比普通的私有化更严格, 确保了数据的封装性和安全性 .
示例:
class Person {private[this] var secret: String = "I have a secret!"def revealSecret(anotherPerson: Person): Unit = {// 无法访问另一个 Person 对象的私有成员//println(anotherPerson.secret) // 这行代码会导致编译错误println(s"My secret is: $secret")}}
// 创建两个 Person 对象val p1 = new Personval p2 = new Person// 尝试访问对象私有化的成员// println(p1.secret) // 这行代码会导致编译错误// 调用revealSecret方法p1.revealSecret(p2) // 这行代码不会导致编译错误 // 输出:My secret is: I have a secret!
在上面的示例中, 我们定义了一个 Person
类, 其中 secret
被声明为对象私有化的成员变量;
在 revealSecret
方法中, 我们尝试访问领一个 Person
对象的私有成员, 但是由于对象私有化的限制, 这会导致编译错误;
5- 辅助构造器
在Scala中, 辅助构造器(Auxiliary Constructor) 是用于创建类的实例的额外构造函数 ;
辅助构造器允许你以不同的方式初始化对象, 为类的使用者提供更多的灵活性 ;
在Scala中, 辅助构造器使用 def this(...)
语法定义, 可以有多个辅助构造器;
辅助构造器必须以调用主构造器或其他辅助构造器的方式开始 ;
class Student(val name: String, val age: Int) {def this(name: String) {this(name, 18) // 调用主构造器}def this() {this("Unknown") // 调用另一个辅助构造器}}
// 创建 Student 类的实例val student1 = new Student()val student2 = new Student("Tom")val student3 = new Student("Bob", 20)println(student1.name, student1.age) // 输出:(Unknown,18)println(student2.name, student2.age) // 输出:(Tom,18)println(student3.name, student3.age) // 输出:(Bob,20)
- 在上面的示例中,
Student
类有一个主构造器和两个辅助构造器 ; - 第一个辅助构造器接受一个参数
name
参数, 调用主构造器并将age
设置为默认值 18 ; - 第二个辅助构造器没有参数, 调用另一个辅助构造器并将
name
设置为 “Unknown” ;
创建类的实例时, Scala会根据提供的参数自动选择调用合适的构造器 ;
你可以根据需要选择不同的辅助构造器来初始化对象, 提供更多的构造选项 ;
辅助构造器为Scala中面向对象编程带来了更多的遍历性和可定制性 .
6- 主构造器
在Scala中, 主构造器(Primary Constructor) 是类定义中的一部分, 用于初始化类的实例;
主构造器可以接受参数, 并在类实例化时执行初始化操作 ;
- 定义主构造器
- 主构造器直接放在类名后面, 可以接受参数并在类实例化时执行初始化
- 主构造器可以包含参数列表, 这些参数可以在类的其他地方方法中使用
- 示例代码
// 主构造器class Person(val name: String, val age: Int) {println(s"Creating a Person with name: $name and age: $age")def displayInfo(): Unit = {println(s"Name: $name, Age: $age")}}// 创建 Person 实例对象val person1 = new Person("John", 30) // Output: Creating a Person with name: John and age: 30val person2 = new Person("Jane", 28) // Output: Creating a Person with name: Jane and age: 28// 调用 displayInfo 方法显示信息person1.displayInfo() // Output: Name: John, Age: 30person2.displayInfo() // Output: Name: Jane, Age: 28
- 示例解释
- 在上面的示例中,
Person
类有一个主构造器, 接受name
和age
两个参数 - 在类实例化时, 主构造器会被调用, 打印初始化信息
displayInfo
方法用于显示Person
对象的信息, 包括姓名和年龄
- 在上面的示例中,
- 主构造器的特点
- 主构造器可以在类的定义中直接使用, 无需额外的
def this()
语法 - 主构造器可以初始化类的成员变量, 并在类实例化时执行初始化逻辑
- 主构造器可以在类的定义中直接使用, 无需额外的
通过主构造器, 你可以定义类的初始化方式, 并在实例化类时执行必要的初始化操作 ;
主构造器是Scala中类的重要组成部分, 用于初始化类的实例 .
7- 嵌套类
在Scala中, 嵌套类(Nested Class) 是指一个类定义在另外一个类的内部 ;
与 Java等语言不同, Scala中的嵌套类是与外部对象绑定的, 而不是与外部类绑定 ;
这意味着每个外部对象都有自己的嵌套类实例 ;
- 定义嵌套类
- 在Scala中, 可以在一个类的内部定义另一个类, 这就是嵌套类
- 嵌套类可以访问外部类的成员, 但是外部类无法直接访问嵌套类的成员
- 示例代码
// 嵌套类class Outer {class Inner {def display(): Unit = {println("Inner class method;")}}}
// 创建 Outer 类的实例val outer = new Outer()// 创建 Inner 类的实例val inner = new outer.Inner()inner.display() // Inner class method;
- 示例解释
- 在上面的示例中,
Inner
类是Outer
类的嵌套类 - 在创建
Inner
类的实例时, 需要使用外部对象Outer
的示例来访问嵌套类 Inner
类的示例可以访问Outer
类的成员, 但是Outer
类的实例无法直接访问Inner
类的成员
- 在上面的示例中,
- 嵌套类的特点
- 嵌套类可以帮助组织和封装相关的类, 使代码更具可读性和模块化
- 每个外部对象都有自己的嵌套类实例, 不同外部对象的嵌套类实例时相互独立的
通过嵌套类, 你可以在Scala中创建更加结构化和模块化的代码, 将相关的类组织在一起, 提高代码的可维护性和可读性 .
end
相关文章:

Scala学习笔记6: 类
目录 第六章 类1- 简单类和无参方法2- 带有getter和setter的属性3- 只带getter的属性4- 对象私有化5- 辅助构造器6- 主构造器7- 嵌套类end 第六章 类 在Scala中, 类用于创建对象的蓝图; 类可以包含方法、值、变量、类型、对象和特质等成员; 类名应该以大写字母开头, 可以包含…...

JS数组根据对象的某一个字段排序
const person [{ name: aa, age: 9 },{ name: bb, age: 17 },{ name: cc, age: 6 },{ name: dd, age: 18 }];// 升序const arr1 person.sort((a, b) > {return a.age - b.age;b})console.log(arr1)// 降序const arr2 person.sort((a, b) > {return b.age - a.age;})co…...

JavaScript操作
做UI自动化的时候,有些操作无法直接通过selenium自带方法操 作成功,那么就需要借助前端js操作实现。 比如浏览器的滚动条这种不是html页面的内容,无法直接通过selenium 控制到。需要借助JavaScript控制。比如有些点击操作无法通过普通点击鼠…...

雪花算法 代码
/*** author lwh* date 2023/9/5* description 批量插入,手动设置**/ public class IdWorker {//因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。//机器ID 2进制5位 3…...

我把PostgreSQL最核心的插件撸干净了!!!
作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…...

Transformer详解(1)-结构解读
Transormer块主要由四个部分组成,注意力层、位置感知前馈神经网络、残差连接和层归一化。 1、注意力层(Multi-Head Attention) 使用多头注意力机制整合上下文语义,它使得序列中任意两个单词之间的依赖关系可以直接被建模而不基于传统的循环结构&#…...

使用Flask Swagger自动生成API文档
文章目录 安装Flask Swagger使用Flask Swagger生成API文档总结1. 自动化文档生成2. 交互式文档展示3. 规范化API设计4. 提升协作效率5. 支持多种格式 Flask Swagger是一种用于管理Flask API文档的工具。它基于OpenAPI规范,可以自动生成API的交互式文档。使用Flask S…...

操作系统408考研-经典例题
什么是操作系统?答:操作系统,是计算机系统中最基本、最重要的系统软件,是其它软件 的***支撑***。控制和管理计算机系统的硬件和软件资源,合理的组织计算机工 作流程,并为用户使用计算机提供公共和基本的服务 2.多道程序 (multiprogrammming) 和多重处理 (multiprocessi…...

工程项目管理系统源码与Spring Cloud:实现高效系统管理与二次开发
随着企业规模的不断扩大和业务的快速发展,传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…...

react中hook 函数的使用
以 use 开头的函数被称为 Hook。useState 是 React 提供的一个内置 Hook。你可以在 React API 参考 中找到其他内置的 Hook。你也可以通过组合现有的 Hook 来编写属于你自己的 Hook。 Hook 比普通函数更为严格。你只能在你的组件(或其他 Hook)的 顶层 调…...

探索k8s集群中kubectl的陈述式资源管理
一、k8s集群资源管理方式分类 1.1陈述式资源管理方式:增删查比较方便,但是改非常不方便 使用一条kubectl命令和参数选项来实现资源对象管理操作 即通过命令的方式来实 1.2声明式资源管理方式:yaml文件管理 使用yaml配置文件或者json配置文…...

webgl入门-绘制三角形
绘制三角形 前言 三角形是一个最简单、最稳定的面,webgl 中的三维模型都是由三角面组成的。咱们这一篇就说一下三角形的绘制方法。 课堂目标 理解多点绘图原理。可以绘制三角形,并将其组合成多边形。 知识点 缓冲区对象点、线、面图形 第一章 web…...

深入分析 Android Activity (三)
深入分析 Android Activity (三) 1. Activity 的配置变化处理 当设备配置(如屏幕方向、语言、屏幕大小等)发生变化时,默认情况下,Android 会销毁并重新创建当前的 Activity。这种行为确保了新配置能够正确应用,但在某…...

电影《朝云暮雨》观后感
上周看了电影《朝云暮雨》,看完之后,感觉自己整个人都不太好了,也不是说电影太差,只是觉得电影没有传达正能量,让人很不舒服。 (1)演技在线 对于著名的演员“范伟”,或者说&#x…...

Isaac Sim仿真平台学习(1)认识Isaac Sim
0.前言 上一个教程中我们下载好了Isaac Sim,这一章我们将来简单了解一下Isaac Sim平台。 isaac Sim仿真平台安装-CSDN博客 1.Isaac Sim是啥? What Is Isaac Sim? — Omniverse IsaacSim latest documentation Isaac Sim是NVDIA Omniverse平台的机器…...

C++:vector基础讲解
hello,各位小伙伴,本篇文章跟大家一起学习《C:vector基础讲解》,感谢大家对我上一篇的支持,如有什么问题,还请多多指教 ! 如果本篇文章对你有帮助,还请各位点点赞!&#…...

Grafana 路径遍历所有路径 CVE-2021-43798漏洞预警
简介 Grafana是一个跨平台、开源的数据可视化网络应用程序平台。用户配置连接的数据源之后,Grafana可以在网络浏览器里显示数据图表和警告。 漏洞危害等级 高危 CVE 编号 CVE-2021-43798 FOFA查询 app"Grafana" zoomeyes查询 app:"gr…...

基于Docker部署GitLab环境搭建
文件在D:\E\学习文档子目录压缩\专项进阶,如ngnix,webservice,linux,redis等\docker 建议虚拟机内存2G以上 1.下载镜像文件 docker pull beginor/gitlab-ce:11.0.1-ce.0 注意:一定要配置阿里云的加速镜像 创建GitLab 的配置 (etc) 、 日志 (log) 、数…...

初始化是什么
定义 初始化(Initialization)是指在计算机科学和软件开发中,将系统、变量、对象或其他可用组件设置为其初始状态或初始值的过程。这通常是在程序开始执行或组件第一次使用之前进行的,以确保其处于可预测和稳定的状态。 初始化的…...

Python图形界面(GUI)Tkinter笔记(九):用【Button()】功能按钮实现人机交互
在Tkinter库中,功能按钮(Button)是实现人机交互的一个非常重要的组件: 【一】主要可实现功能及意义: (1)响应用户交互: Button组件允许用户通过点击来触发某个事件或动作。当用户点击按钮时,可以执行一个指定的函数或方法。 (2)提供用户输入: Button组件是图形用户界面(G…...

linux 内核安装、切换版本,禁用内核更新
安装内核 版本5.15.0-105 sudo apt-get install linux-image-5.15.0-105-generic sudo apt-get install linux-headers-5.15.0-105-generic切换内核版本 #查看已安装内核版本 grep menuentry /boot/grub/grub.cfg sudo dpkg --get-selections |grep linux-image#修改文件/etc…...

充电桩中PE接地实时监测的一种电路.pdf
pdf下载链接:https://pan.baidu.com/s/18k8tEwa6h3WAOGJs3lAsTQ 提取码:Ronv...

鲲泰新闻丨第七届数字中国建设峰会正式启幕,神州鲲泰携手天翼云共筑智算云生态
2024年5月23日,由国家发展改革委、国家数据局、国家网信办、科技部、国务院国资委、福建省人民政府共同主办的“第七届数字中国建设峰会”在福建省福州市海峡国际会展中心盛大开幕。 数字中国建设峰会是展示数字中国建设成就的盛会,本次峰会以“释放数据…...

零基础学Java第二十二天之IO流之内存流,打印流,随机流
IO流之内存流,打印流,随机流 1、内存流 1、理解 内存流"(Memory Stream)在计算机编程中通常指的是一种特殊的数据流,它在内存中存储和操作数据,而不是在外部存储(如硬盘、网络等…...

vue-router路由懒加载以及三种实现方式
什么是路由懒加载? 延迟加载或按需加载路由所对应的组件,而不是在应用初始化时就一次性加载所有组件。 路由懒加载做了什么事情? 主要作用是将路由对应的组件打包成一个个的js代码块 只有在这个路由被访问到的时候,才加载对应…...

Java轻松转换Markdown文件到Word和PDF文档
Markdown 凭借其简洁易用的特性,成为创建和编辑纯文本文档的常用选择。但某些时候我们需要更加精致的展示效果,例如在专业分享文档或打印成离线使用的纸质版时,就需要将Markdown文件以其他固定的文档格式呈现。通过将 Markdown 转换为 Word 和…...

【JAVA基础之内部类】匿名内部类
🔥作者主页:小林同学的学习笔录 🔥小林同学的专栏:JAVA之基础专栏 目录 1.内部类 1.1 概述 1.1.1 什么是内部类 1.1.2 什么时候使用内部类 1.2 内部类的分类 1.3 成员内部类 1.3.1 获取成员内部类对象的两种方式 1.3.2 经典面试…...

远动通讯屏的原理和应用
远动通讯屏的原理和应用 远动通讯屏,是一种集显示和远程控制于一体的智能化控制设备。它可以通过网络、通信线路等方式实现与远程设备的通讯和交互,从而实现远程监控和控制。 远动通讯屏实现远程控制的核心原理是基于PLC(Programmable Logic …...

C++ (week4):Linux基础
文章目录 零、Linux简介1.配置环境2.Linux历史3.Linux模型 一、vim二、Linux命令行 (shell命令)1.常用命令与快捷键(1)常用命令①man命令:查看帮助手册 (2)快捷键 2.用户子系统(1)Linux用户(2)用户命令 3.文件子系统命令(1)目录命令1.创建文件:mkdir2.删…...

如何将手机中的音乐转移到 SD 卡上?轻松传输音乐
概括 如何将音乐从手机转移到 SD 卡?我们的智能手机可以充当个人点唱机,因此有效管理我们的音乐库变得至关重要。无论您是存储空间不足还是只是想整理您的音乐收藏,将音乐从手机传输到 SD 卡都是一个实用的解决方案。 在本指南中࿰…...