Scala学习笔记-声明值和变量

Scala-值和变量

这里写图片描述

scala中的变量有两种,一种是可变的,用var来声明,另一种的不可变的用val来声明,下面我们就来简要说明一下。


首先,用val声明一个不可变的变量msg1,从结果中可以看到msg1的类型为String

scala> val msg1 = "hell world"
msg1: String = hell world
scala>

那么既然val是迎来声明不可变的变量,如果对其值进行修改会发生什么事呢?

scala> msg1 = "update content"
<console>:11: error: reassignment to val
       msg1 = "update content"
            ^
scala>

此时,编译器给出了一个非常明确的错误提示:对一个 val 再次复制是错误的。

由于scala是基于一门基于Jvm的函数式编程语言,那么底层一定严格遵循Java的语法规范,那么问题来了,val变量怎么与Java映射?


我们来定义一个类,这个类仅包含一句val变量的声明:

class Test {
    val msg = "HelloWorld"
}

然后利用scalac将其编译成class文件,在进行反编译

scalac Test.scala

反编译后的源码如下:

public class Test
{
  private final String msg = "HelloWorld";

  public String msg() { 
      return this.msg;
  }
}

一目了然了。


val相对应的是varvar类型的变量在声明后可以对其内容进行修改

scala> var msg2 = "Hello World"
msg2: String = Hello World

scala> msg2 = "update context"
msg2: String = update context

scala>

同样,我们看一下val变量对应的Java源码

public class Test
{
  private String msg = "HelloWorld";
  public String msg() { return this.msg; } 
  public void msg_$eq(String x$1) { this.msg = x$1; }
}

可以看到,var的变量不在是final的,同时,还多列一个设值器方法msg_ eq(Stringx 1),这完全符合Java编码规范。

细心的同学可能已经看到了,无论是val还是var,在变量声明的过程中,都没有像Java那样,指定变量的具体类型

String msg = "Hello World"

这得益于scala的类型推断机制,scala编译器可以根据值类型来推断出变量的所属类型。
当然,在声明变量时,有时为了代码的可读性,也会添加变量类型的声明

scala> val msg3: String = "a"
msg3: String = a

scala> var msg4: String = "b"
msg4: String = b

scala>

这样做有两点好处,第一、可以使代码更加清晰可读,第二、可以让编译器和程序猿的想法保持一致。

总结:
  • val变量赋值后不能对其改变
  • var变量赋值后可以对其修改
  • 在声明var或val变量时,可以不显式制定变量的类型
  • val变量对于Java中的final字段
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值