开发者学堂课程【Scala 核心编程-基础:Scala 变量的注意事项】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8890
Scala 变量的注意事项
内容介绍
一、变量声明基本语法
二、注意事项
一、变量声明基本语法
var / val 变量名[:变量类型]=变量值 //变量类型可以写也可以不写
二、注意事项
1、声明变量时,类型可以省略(编译器自动推导,即类型推导)
在 JDK8.0的时候就加入了,JDK8.0也支持类型推导,是因为 Scala 加进去后导致 JDK8.0有这个功能。
比如:
package com.atguigu.chaptero1.vars
object VarDemoo2 {
def main(args : Array[string]): unit = {
//类型推导
var num = 10 //这时 num 就是 Int 类型
证明 num 是 int 类型有两个方法:
(1)可以利用 idea 的提示来证明
(2)使用 isInstanceof[Int]判断
println( num.isInstanceof[Int])
在 Java 里面学过 isInstanceof,判断一个对象是不是一个类的类型
输出显示:
D: \programljdk8\bin\java ..
true
Process finished with exit code o
输出了一个 true,说明是 Int。
2、类型确定后,就不能修改,说明 Scala 是强数据类型语言.
比如在上方基础上再写入 num=1.1 是不行的,因为一旦上方num类型推导以后他就是 Int,不能再改了,可以修改值,但不能修改类型。
有些语言是可以的,给它一个10,运行时它是 Int,后面再给1.1就变成了 double 类型了。
所以有些人学完静态编程语言,然后学动态会觉得非常不习惯。
Scala 是强数据类型语言也叫静态语言,因为编译器编译的时候在底层已经把类型写进去了。
3、在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰的变量可改变,
val 修饰的变量不可改[案例].
(1)定义一个变量:var age=10
然后对age值发生修改:age=30 //这里是可以的
说明变量如果用 var 修饰时,age 是可以改变的。
(2)定义一个变量:val num2=30
对 num2值进行修改:num2=40 //这时就会报错
说明 val 修饰的变量是不可以改变的。
设计 var 和 val 这两种可变和不可变是因为:
在通常情况下得到一个对象,往往只是读这个对象的内容,或者修改这个对象的属性,所以在实际编程中,更多的需求是获取/创建一个对象后,读取该对象的属性,或者是修改对象的属性值,但很少去改变这个对象本身。
比如有一个对象是 dog 然后 new 一个 dog:dog=new dog()这个 dog 里面可能有一个 age 可以去修改:
dog.age=10,这样是可以的,但是很少有 dog=new dog()分配一个新 dog。
这时,就可以使用 val,因为 val 没有线程安全问题,因此效率高。Scala 设计者推荐使用 val。
如果对象需要变化,则使用 var,比如:
Class Dog {
//声明一个 age 属性,给了一个默认值_
var age : Int =0 //
//声明名字
var name: string = “” //
}
比如 val dog=new dog //这个 dog 是用 val 修饰的,所以不能修改
这时再给它一个新的 dog:dog=new dog 这样就报错了,因为这个 dog 已经指向了一只狗现在又指向另外一个,这样就会报错:reassignment to val 不能再分配了。
但是属性是 var,可以改,所以:
Dog.age=90
Dog.name=“小花“
//这两个都可以改变
这样既可以让属性改变,同时还约束对象本身不改变,对象本身不改变的话编译器就可以在底层进行优化。
如果将 var name: string = “”改为 val name: string = “” 就会马上报错。
4、val 修饰的变量在编译后,等同于加上 final,通过反编译看下底层代码。
Final 表示最后、最终的意思,就代表不可改变。
举例:
package com.atguigu.chaptero1.vars
object VarDemo03 {
var name = "hello"
val age = 100
def main(args: Array[string]): unit = {
println("ok")
编译一下,编译完成后看底层反编译的代码,运行输出:
D: \programljdk8\binljava…
ok
Process finished with exit code o
看一下 var 和 val 有什么不同:打开反编译工具显示:
现在这里写了 VarDemo03对应生成了两个 class 文件,如果只是关心这个 VarDemo03应该看的是上面这个 class文件还是下面这个?
看上面这个,因为下面这个其实是进行了一个包装,相当于一个半生类,因为现在没有写半生类,所以生成了一个空的,所以 object 对应的类就是上边那个。
点击打开显示:
public final class varDemoo3$
{
public static finalMODULE$;
private string name;
private final int age:
这是对应的底层反编译代码。