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的出现为软件开发带来了新的思路和可能性,为未来的软件开发提供了更多的选择和灵活性。