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

6 scala-面向对象编程基础

Scala 跟 Java 一样,是一门面向对象编程的语言,有类和对象的概念。

1 类与对象

与 Java 一样,Scala 也是通过关键字 class 来定义类,使用关键字 new 创建对象。

要运行我们编写的代码,同样像 Java 一样,需要一个 main 方法作为程序启动的入口。

我们知道,在 Java 中,main 方法是一个静态方法,但在 Scala 中,並沒有静态方法和静态属性。在 Scala 中,定义在单例对象 object 中的方法和属性就等价于 Java 中的静态方法和静态属性。

下面定义一个没有任何方法与属性的球员信息类,并在创建该类对象。

class FootballPlayer { }object App {def main(args: Array[String]): Unit = {print(new FootballPlayer())}
}

运行后,控制台打印 FootballPlayer@4cf777e8

2 成员变量

在定义类时,可以通过 valvar 定义类的成员变量。

valvar 的区别在于,val 定义的变量在初始化后就不能被改变,这类似于 Java 中的 final

下面例子,创建一个球员类,包含姓名、年龄、所在俱乐部,最后在 main 方法中打印球员对象信息:

class PlayerInfo {var playerName: String = "沙拿"var age: Int = 31var club: String = "利物浦"
}object App {def main(args: Array[String]): Unit = {val playerInfo = new PlayerInfoprintln(s"初始化球员是在${playerInfo.club}${playerInfo.playerName},今年${playerInfo.age}岁")playerInfo.playerName = "孙兴慜"playerInfo.age = 30playerInfo.club = "热刺"println(s"您选择的球员是在${playerInfo.club}${playerInfo.playerName},今年${playerInfo.age}岁")}
}

运行后,在控制台打印:

初始化球员是在利物浦的沙拿,今年31岁
您选择的球员是在热刺的孙兴慜,今年30岁

3 成员变量初始化值

在编写 Java 类时,如果我们不给成员变量指定默认值,那么对于基本类型,如 int、long、short、float、long 则初始化值为 0,引用类型为 null。

但在 Scala 中,如果不给成员变量指定默认值,就会出现编译错误:

在这里插入图片描述
编译器告诉我们,有3个未初始化的成员变量。

我们可以使用下划线 _ 初始化成员变量,例如:

class PlayerInfo {var playerName: String = _var age: Int = _var club: String = _
}object App {def main(args: Array[String]): Unit = {val playerInfo = new PlayerInfoprintln(s"初始化球员是在${playerInfo.club}${playerInfo.playerName},今年${playerInfo.age}岁")}
}

运行程序,控制台打印:

初始化球员是在null的null,今年0岁

可以得出这样的结论:定义成员变量时,需要使用 _ 初始化成员变量,初始化规则跟 Java 一致,int、long、short、float、long 则初始化值为 0,引用类型为 null。

4 成员方法

我们可以使用关键字 def 为类定义方法。例如,我们为球员类添加一个 hello 方法:

class PlayerInfo {var playerName: String = _var age: Int = _var club: String = _def hello(): String = {s"Hey buddy, I am ${this.playerName} of ${this.club}, ${this.age} years old!"}
}object App {def main(args: Array[String]): Unit = {val playerInfo = new PlayerInfoplayerInfo.playerName = "Cristiano Ronaldo"playerInfo.age = 39playerInfo.club = "Al-Nassr FC"println(playerInfo.hello())}
}

运行程序,控制台输出:

Hey buddy, I am Cristiano Ronaldo of Al-Nassr FC, 39 years old!

5 访问修饰符

Scala 也可以使用访问修饰符对成员变量、方法的访问进行控制:

5.1 public

Scala 没有 public 修饰符,因为,不加修饰符的属性和方法就是 public,即,在任何地方,类、属性、方法都可以被访问

5.2 private

5.2.1 修饰类

private 修饰的类可在当前包共生对象 被访问:
在这里插入图片描述

5.2.2 修饰成员变量或方法

private 修饰的成员变量、方法,只能在当前类共生对象 中访问:
在这里插入图片描述

5.2.3 private[this]

private[this] 修饰的属性和方法,只能在本类中被引用,共生对象也不能引用。

5.2.4 private[包名]

默认情况下,子包是无法访问被 private 修饰的 属性和方法的:
在这里插入图片描述
当我们需要在当前包及子包中共享类的属性和方法时,我们可以使用 private[包名],其中包名为当前类所在的包,表示,被修饰的目标可以在当前包和子包中被访问:
在这里插入图片描述

5.3 protected

与 Java 的 protect 不同,在 Scala 中被 protected 修饰的属性、方法,只能被当前类,子类访问。

在 Java 中,被 protect 修饰的属性和方法可以被同包下的类访问,但在 Scala 中,被 protected 修饰的属性和方法不能被同包类访问。
在这里插入图片描述

相关文章:

6 scala-面向对象编程基础

Scala 跟 Java 一样,是一门面向对象编程的语言,有类和对象的概念。 1 类与对象 与 Java 一样,Scala 也是通过关键字 class 来定义类,使用关键字 new 创建对象。 要运行我们编写的代码,同样像 Java 一样,…...

【linux温故】linux调度机制

假如你是设计者,你会设计怎样的调度机制呢? 时间片 最简单的,小学生都能想出来的一种,每个 ready task,按照一个固定的时间片轮流执行。 大家不要抢,挨个儿排队执行。执行完时间片,就排在后面…...

django中如何使用mysql连接池

一:介绍 在Django中使用MySQL时,通常情况下,Django的数据库层会为你管理数据库连接。Django的数据库接口是线程安全的,这意味着它会自动为每个线程创建和管理数据库连接。在大多数情况下,你不需要手动创建线程池来管理…...

3D高斯溅射:面向三维场景的实时渲染技术

1. 前言 高斯溅射技术【1】一经推出,立刻引起学术界和工业界的广泛关注。相比传统的隐式神经散射场渲染技术,高斯溅射依托椭球空间,显性地表示多目图像的三维空间关系,其计算效率和综合性能均有较大的提升,且更容易理…...

【数据结构】13:表达式转换(中缀表达式转成后缀表达式)

思想: 从头到尾依次读取中缀表达式里的每个对象,对不同对象按照不同的情况处理。 如果遇到空格,跳过如果遇到运算数字,直接输出如果遇到左括号,压栈如果遇到右括号,表示括号里的中缀表达式已经扫描完毕&a…...

MySQL进阶查询篇(9)-视图的创建和应用

数据库视图是MySQL中一个非常重要的概念。它是一个虚拟表,由一个查询的结果集组成。数据库视图为用户提供了一种简化数据查询和操作的方式。本文将介绍MySQL数据库视图的创建和应用。 1. 创建数据库视图 要创建MySQL数据库视图,我们使用CREATE VIEW语句…...

Rhino.Inside带材质将Revit模型bake到Rhino

Hello大家好!我是九哥~ 今天来讲一个小技巧,就是我通常采用RIR将Revit的模型的Geometry Bake到Rhino,肯定是没有材质的,那么如果我们需要带材质那要怎么办呢? 对于会的人,其实挺简单的,只需要…...

随记-Java项目处理SQL注入问题

现象:http://10.xx.xx.xx:xx/services/xxService 存在SQL注入情况 加固意见: 需要对网站所有参数中提交的数据进行过滤,禁止输入“"、"xor"、"or"、”--“、”#“、”select“、”and“等特殊字符;所有…...

精读《js 模块化发展》

1 引言 如今,Javascript 模块化规范非常方便、自然,但这个新规范仅执行了 2 年,就在 4 年前,js 的模块化还停留在运行时支持,10 年前,通过后端模版定义、注释定义模块依赖。对经历过来的人来说,…...

Proteus -模拟串口被关闭后怎样打开

Proteus -模拟串口被关闭后怎样打开 点击恢复弹出窗口,即可重新打开...

【深度学习】pytorch 与 PyG 安装(pip安装)

【深度学习】pytorch 与 PyG 安装(pip安装) 一、PyTorch安装和配置(一)、安装 CUDA(二)、安装torch、torchvision、torchaudio三个组件(1)下载镜像文件(2)创建…...

Bert与ChatGPT

1. Bert模型 BERT(Bidirectional Encoder Representations from Transformers)是一种预训练语言表示的方法,由Google AI在2018年提出。它标志着自然语言处理(NLP)领域的一个重大进步,因为它能够理解单词在…...

微信自动预约小程序开发指南:从小白到专家

随着互联网的发展,小程序已经成为了一个备受欢迎的在线预约平台。本文将详细介绍如何使用第三方制作平台,如乔拓云网,来搭建一个从入门到精通的预约小程序。 首先,我们需要登录乔拓云网,并选择一个适合自己的小程序模板…...

巴尔加瓦算法图解【完结】:算法运用(下)

目录 布隆过滤器HyperLogLogSHA算法比较文件检查密码 Diffie-Hellman密钥交换线性规划结语(完结) 布隆过滤器 在元素很多的情况下,判断一个元素是否在集合中可以使用布隆过滤器。布隆过滤器(Bloom Filter)是 1970 年由…...

hexo部署到gitee(码云)

引言 Hexo 是一个基于Node.js的静态博客框架,而 Gitee(也被称为码云)是一个国内的代码托管平台,支持 Git 版本控制系统,与 GitHub 类似。将 Hexo 部署到 Gitee Pages 可以让你的博客受益于 Gitee 的国内服务器&#xf…...

linux系统非关系型数据库memcached

memcached 特点原理配置安装Memcached 特点 内置内存存储方式-----------为了提高性能,memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中,重启操作系统会导致全部数据消失简单key/value存储---------------服务器不…...

前端vite+vue3——自动化配置路由布局

文章目录 ⭐前言💖vue3系列文章 ⭐ 自动化配置路由💖引入vite版本自定义目录映射💖自动化读取文件下的路由💖main入口加载路由💖入口app.vue配置💖layout基础布局配置💖效果 ⭐总结⭐结束 ⭐前言…...

速盾:怎么拿高防服务器做CDN

想要拿高防服务器做CDN,首先需要了解什么是CDN。CDN,即内容分发网络(Content Delivery Network),是一种通过互联网连接多个服务器,将静态和动态内容分发到最接近用户的服务器节点,从而提高用户访…...

SQLite database实现加密

注意:以下操作以VS2022为开发工具,以C#为开发语言。 数据加密原因 软件在使用的各个场景,很多都需要数据具有保密性,于是对于数据库就需要加密。特别是在某些特定领域或存储敏感数据尤其如此。 SQLite加密实现 SQLite加密有两种…...

Python requests模块 快速入门 这篇就够了

目录 一、Requests概述 二、安装Requests 三、Get请求 3.1 Get请求示例 3.2 Get请求爬取二进制数据 四、Post请求 4.1 Post请求示例 4.2 发送JSON数据 五、验证Cookies 六、会话请求 一、Requests概述 Requests是一个流行的Python第三方库,它专为HTTP通信…...

XML Group端口详解

在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

7.4.分块查找

一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)&#xff0…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...