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博客

相关推荐
卷无止境4 分钟前
Python Dataclasses:让类定义回归简洁的艺术
后端·python
末代iOS程序员华仔29 分钟前
OPC + Flutter + Swift:跨平台应用上架与专业知识点获客实战指南
开发语言·flutter·swift
脚踏实地皮皮晨30 分钟前
003004002_UniformGrid控件的使用方法
开发语言·c#·.net·wpf·visual studio
j7~2 小时前
【Linux】二十六.线程篇三《Linux多线程编程:线程控制、线程ID以及进程地址空间分布、线程局部存储__thread以及clone系统调用》---详解
linux·运维·服务器·开发语言·c++·多线程编辑·线程的控制
维吉斯蔡9 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
前端工作日常10 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
前端工作日常11 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
犀利豆11 小时前
Claude Code Tools 研究系列(三)ExitPlanMode
人工智能·后端
luj_176811 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法