scala变量与变量类型

|------------------|
| 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修饰的变量;

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

变量声明一定要初始化

1.6.1 变量推断

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

Go 复制代码
// 定义变量a1,使用1赋值,自动推断为Int类型
var i1 = 1
print(i1.isInstanceOf[Int])
//类型确定后,就不能再赋值的类型
i1 = 1.1
1.6.2 多变量定义
Scala 复制代码
//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修饰的变量,内容和引用都可变

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

Scala 复制代码
/**可变和不可变?
可变和不可变,指的是变量本身存的内容,值类型变量存的是数据本身,而引用类型变量存的是数据的引用,
​
值类型和引用类型?
值类型与引用类型区别:
存储方式:直接存储数据本身 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定义变量后,只有在调用该变量时才会实例化这个变量的值,类似方法,先声明,后调用。

java 复制代码
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所定义的变量即回收

代码

Scala 复制代码
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博客

相关推荐
Chester_19995 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
2601_962055976 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
EXI-小洲6 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员7 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导7 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan7 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251497 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
Lost of 程序猿8 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
大衛說8 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
QQ_21696290969 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端