scala变量与变量类型

news2024/9/20 14:45:14

1.6 变量与类型(重点)
1.6.1 变量推断
1.6.2 多变量定义
1.6.3 var和val的区别

1.6.3.1 是否可变

1.6.3.2 延迟加载
1.6 变量与类型重点

val修饰的变量,相当于Java中final修饰的变量;

// 定义常量s1,使用字符串"1"赋值,自动推断为String类型,值不可变
val s1 = "1"
// 定义常量s2,手动指定类型为String,此时需要保证所赋值类型匹配
val s2: String = "2"
// 使用val定义基本数据类型时,值不可变,可以使用val重新定义

变量声明一定要初始化

1.6.1 变量推断

含义:声明变量时,可以不指定变量类型,编译器会根据赋值内容自动推断当前变量的类型。

// 定义变量a1,使用1赋值,自动推断为Int类型
var i1 = 1
print(i1.isInstanceOf[Int])
//类型确定后,就不能再赋值的类型
i1 = 1.1
1.6.2 多变量定义
//Java中支持一行同时定义多个同类变量:
String a = "Hello", c = "hello";  
int x = 5, y = 5;  
//scala中的多个变量的初始化:
val (a, b, c) = (1, 2, "a")
// 定义变量a3,a4,同时赋值为10
var i3,i4 = 10;
1.6.3 var和val的区别
# val和var的区别
​
- 是否可变
- 是否可以有lazy修饰:延迟加载
1.6.3.1 是否可变

使用val声明一个常量或值:val修饰的变量是不可变的,注意不可变的是引用,而不是内容,val修饰的变量在编译后,等同于加上final。

使用var 声明一个变量:var修饰的变量,内容和引用都可变

(扩展一下什么是值类型,什么是引用类型,可以使用数组举例,引用不可变,变的是内容。)

/**可变和不可变?
可变和不可变,指的是变量本身存的内容,值类型变量存的是数据本身,而引用类型变量存的是数据的引用,
​
值类型和引用类型?
值类型与引用类型区别:
存储方式:直接存储数据本身 vs 存储的是数据的引用,数据存储在数据堆中
内存分配:分配在栈中 vs 分配在堆中
效率:效率高,不需要地址转换 vs 效率较低,需要进行地址转换
内存回收: 使用完后立即回收 vs 使用完后不立即回收,而是交给GC处理回收
*/
scala> val arr = Array(1,2,3,4,5)
arr: Array[Int] = Array(1, 2, 3, 4, 5)
scala> arr = Array(1,2,3)
<console>:8: error: reassignment to val
       arr = Array(1,2,3)
scala> arr(0)=10
scala> arr
res1: Array[Int] = Array(10, 2, 3, 4, 5)
1.6.3.2 延迟加载

只有val修饰的变量才能被lazy修饰,使用lazy定义变量后,只有在调用该变量时才会实例化这个变量的值,类似方法,先声明,后调用。

scala> val a = 10
a: Int = 10
scala> lazy val b = 100
b: Int = <lazy>
scala> b
res2: Int = 100
scala> var c = 10
c: Int = 10
scala> lazy var d = 100
<console>:1: error: lazy not allowed here. Only vals can be lazy
       lazy var d = 100
            ^
scala> def e = 1000
e: Int
scala> e
res3: Int = 1000

使用val 还是var?

# 官方推荐val,使用val的好处:
- 更安全
- 代码可读性更高
- 资源回收更快,方法执行完,val所定义的变量即回收

代码

package com.qianfeng.scala
​
/**
* 变量必须赋值或者是使用占位符初始化
* val 变量名称[:类型] = 值   : 不可变 ,相当于java的final修饰
* var 变量名称[:类型] = 值   : 可变
* lazy val 变量名称[:类型] = 值  懒加载,必须使用val
*
* 注意:
* 1、官方推荐我们使用val
* 2、类型自动推断
*/
object Demo02_Variable {
  def main(args: Array[String]): Unit = {
    val a = 100
    val b:String = "abc"
    println(a)
    //修改a的值
    //a = 200  //报错:不能改变值
​
    var c = 100
    println(c)
    c = 200
    println(c)
​
    lazy val d = 1000
    println(d)
​
    //lazy var dd = 1000   //报错:lazy只能修饰val变量
​
    //多变量
    val (aa,cc,dd) = (1,2,"hello")
    println(aa,dd)
    val i1,i2 = 10
    println(i1,i2)
  }
}
​

 scala下载安装地址:

scala安装使用教程_一篇搞定!-CSDN博客

氺字数(不用管):

Scala是一种多范式编程语言,由Martin Odersky于2003年创建。它结合了面向对象编程和函数式编程的特性,旨在提供一种简洁、高效、灵活的编程语言,既能满足大规模系统的需求,又能提供简单易用的语法和工具。

Scala的语法简洁、灵活,支持面向对象编程和函数式编程的特性。它具有强大的静态类型系统,可以提供更好的代码安全性和可维护性。同时,Scala还支持高阶函数、模式匹配、并发编程等功能,使得编写复杂的程序变得更加简单和高效。

Scala运行在Java虚拟机(JVM)上,可以与Java无缝集成,可以直接调用Java的类库和工具。这使得Scala成为了一个非常有吸引力的选择,特别是对于那些已经熟悉Java的开发者来说。

另外,Scala还提供了丰富的工具和框架,如Akka、Play Framework等,使得开发者可以更加轻松地构建高性能、可伸缩的应用程序。

Scala的特点包括:
1. 静态类型系统:Scala的静态类型系统可以提供更好的代码安全性和可维护性,同时还能减少开发时的错误。

2. 函数式编程:Scala支持函数式编程,包括高阶函数、不可变性、模式匹配等特性,使得编写复杂的程序变得更加简单和高效。

3. 并发编程:Scala提供了丰富的并发编程工具和库,如Akka框架,使得开发者可以更加轻松地编写高性能的并发程序。

4. 与Java的无缝集成:Scala可以与Java无缝集成,可以直接调用Java的类库和工具,这使得开发者可以更加灵活地使用两种语言的特性。

5. 可伸缩性:Scala的设计目标之一是支持大规模系统的开发,它提供了丰富的工具和框架,使得开发者可以更加轻松地构建高性能、可伸缩的应用程序。

总的来说,Scala是一种功能强大、灵活多样的编程语言,它结合了面向对象编程和函数式编程的优点,为开发者提供了更多的选择和可能性。它的出现对于现代软件开发来说是一个重大的进步,为开发者提供了更多的工具和技术来构建复杂的应用程序。Scala的出现为软件开发带来了新的思路和可能性,为未来的软件开发提供了更多的选择和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1305247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

11.进制转换:十进制转二进制【2023.12.3】

1.问题描述 计算机底层原理中常使用二进制来表示相关机器码&#xff0c;学会将十进制数转换成二进制数是一个非常重要的技能。现在编写一个程序&#xff0c;输入一个十进制数&#xff0c;将其转换成二进制数。 2.解决思路 使用内置函数bin()将十进制数转换为二进制数 3.代码…

FreeRTOS的三处栈空间设置分析

1、汇编启动代码中设置栈 这个栈空间只有300字节&#xff0c;是用于汇编启动代码早期&#xff0c;以及调用C语言的main函数&#xff08;创建任务等&#xff09;在创建好任务&#xff0c;启动调取器后&#xff0c;这个栈空间就被抛弃掉&#xff0c;后续不会使用到等调度器开启后…

问卷调查:如何防止随意作答以提高数据质量

在进行问卷调查的时候&#xff0c;我们经常要面临一个问题——答题者随意作答。这往往会导致我们收集的问卷数据不准确&#xff0c;影响问卷的最终结论。所以&#xff0c;我们要开展问卷调查的过程中&#xff0c;要运用一些合理的方法和技巧&#xff0c;避免这种情况发生。问卷…

频率、概率

频率 在相同的条件下进行试验&#xff0c;假设试验进行了次&#xff0c;其中随机事件A发生了次&#xff0c;那么就称为随机事件A发生的频率。 概率 假设随机试验E的样本空间是S&#xff0c;对于其中每个随机事件&#xff0c;都对应了一个实数&#xff0c;把这个实数称为随机…

1842_emacs使用company-irony实现C语言的自动补全

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 1842_emacs使用company-irony实现c语言的自动补全 irony-mode是一个自动补全的实现方案&#xff0c;配合company集成之后效果非常好。简单调试完了之后…

理解排序算法:冒泡排序、选择排序与归并排序

简介&#xff1a; 在计算机科学中&#xff0c;排序算法是基础且重要的概念。本文将介绍三种常见的排序方法&#xff1a;冒泡排序、选择排序和归并排序。我们将探讨它们的工作原理、特点和适用场景&#xff0c;以帮助读者更好地理解和选择合适的排序方法。 冒泡排序 冒泡排序是…

如何通过上下滑动实现亮度和音量调节(ArkUI)

场景说明 在音视频应用中通常可以通过上下滑动来调节屏幕亮度和音量大小&#xff0c;本例即为大家介绍如何实现上述UI效果。 说明&#xff1a; 由于当前亮度和音量调节功能仅对系统应用开发&#xff0c;所以本例仅讲解UI效果的实现。 效果呈现 本例效果如下&#xff1a; 当在…

Python 进阶(十五):Base64 编码和解码(base64 模块)

大家好&#xff0c;我是水滴~~ 本篇文章主要介绍Python的base64模块&#xff0c;主要内容有&#xff1a;Base64的概念、base64模块、base64编码和解码、以及其使用场景。文章中包含大量的示例代码&#xff0c;希望能够帮助新手同学快速入门。 《Python入门核心技术》专栏总目录…

SpringBoot程序的打包与运行

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

什么是接口与API接口!

今天有个朋友问我什么接口&#xff1f;你们平时都说在写接口&#xff0c;写的是什么鬼啊&#xff1f;我一开始就想&#xff0c;咦小陈同学怎么突然了解编程接口了&#xff0c;不过听到他后一个提问我知道原来他想的是API接口&#xff0c;不过被我主观意识习惯想成了编程定义上的…

HCIA-H12-811题目解析(7)

1、【多选题】RSTP协议包含以下哪些端口状态&#xff1f; 2、【单选题】当采用LACP模式进行链路聚合时华为交换机的默认系统优先级是&#xff1f; 3、【单选题】下面关于二层以太网交换机的描述说法不正确的是&#xff1f; 4、【单选题】以下哪种类型的ACL不能匹配网络层信息…

mysql,树形结构表中,查询所有末节点数据(叶子结点)

需求&#xff1a;在一个可以存放多级目录的表中&#xff0c;查询出某个课程目录下所有末节点&#xff08;因为只有末节点可以挂载资源&#xff09; 例如下图&#xff1a; 其中 1.11.2.12.1 都是末节点&#xff0c;因为他们已经没有下一级了 catalog表中重要字段有&#xff1a;c…

工具应用:Robot Framework->对协议级接口进行测试

实验简介 本节实验主要为大家讲解如何利用Robot Framework结合常用的关键字完成对Agileone系统中的“需求提案”模块进行协议级接口的自动化测试脚本开发。 实验目的 &#xff08;1&#xff09; 掌握RF的Requests库的常用关键字及用法。 &#xff08;2&#xff09; 能够熟练…

成都工业学院Web技术基础(WEB)实验六:ECMAScript基础语法

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

使用kubeadm部署一套Kubernetes v1.23.0集群

使用kubeadm部署一套Kubernetes v1.23.0集群 1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; • kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部…

cobalt strike基础使用

coblat strike使用 服务搭建 首先将server端文件放进kali中 对其赋权 执行时需要root权限 设置ip 启动服务 ./teamserver 10.4.7.138 123456回到win11启动cs&#xff0c;输入刚才配置的信息 上线方式 木马&#xff08;exe上线&#xff09; 查看一下开放的端口 添加监听 …

Python 进阶(十六):二进制和ASCII码的转换(binascii 模块)

大家好&#xff0c;我是水滴~~ 本文详细介绍了Python中的binascii模块及其使用方法。通过binascii模块&#xff0c;我们可以方便地进行二进制和ASCII字符串之间的转换操作。文章中包含大量的示例代码&#xff0c;希望能够帮助新手同学快速入门。 《Python入门核心技术》专栏总…

【web安全】逻辑越权漏洞

前言 菜某分享&#xff0c;有误请指正 越权漏洞功能 顾名思义&#xff0c;他能使用别的用户的权力。我们网站有许多用户&#xff0c;有普通用户&#xff0c;管理员&#xff0c;最高级的管理员等多种账户。这个越权漏洞就是指我们可以行使别的用户的权力。 越权漏洞的分类 …

Knowledge Graph知识图谱—9. Data Quality and Linking

9. Data Quality and Linking 9.1 How well are the linked open data in practice? Linked Open Vocabularies(LOV) project – analyze usage of vocabularies 9.2 Quality Linked Data Conformance vs. Quality Conformance: – i.e., following standards and best prac…

归并排序的实现

一.思想 归并排序是一种基于分治思想的经典排序算法。其主要思想可以总结为以下几个步骤&#xff1a; 分解&#xff08;Divide&#xff09;&#xff1a; 将原始序列划分为若干子序列&#xff0c;直到每个子序列包含一个或零个元素&#xff0c;即认为这些子序列是有序的。 解决…