Cris 的 Scala 笔记(三):变量

文章目录

    • 3.变量
      • 3.1 基本概念
      • 3.2 数据类型
      • 3.3 数据类型体系图
      • 3.4 整数类型
      • 3.5 浮点数据类型
      • 3.6 字符类型(Char)
      • 3.7 布尔类型
      • 3.8 Unit类型、Null类型和Nothing类型
      • 3.9 值类型转换
      • 3.10 值类型和字符串的转换
      • 3.11 标识符的命名规范

3.变量

3.1 基本概念

变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)

变量的初始化(自动类型推断)scala要求变量声明时初始化

var age = 12
var name = "cris"
var flg = true
var key = 'a'

// 如果不使用 Scala 的自动类型推断
val b: Double = 11.11
var a: String = "simida"

变量使用详解

var | val 变量名 [: 变量类型] = 变量值,说明:在scala中声明一个变量时,可以不指定类型,编译器根据值确定

声明变量时,类型可以省略(编译器自动推导,即类型推导)

类型确定后,就不能修改,说明Scala 是强数据类型语言

在声明/定义一个变量时,可以使用var 或者 val 来修饰, var 修饰的变量可改变(值和引用),val 修饰的变量不可改(引用)

val修饰的变量在编译后,等同于加上final通过反编译看底层代码就知道了

var 修饰的对象引用可以改变,val 修饰的则不可改变,但对象的状态(值)却是可以改变的。(比如: 自定义对象、数组、集合等等)

变量声明时,需要初始值

object Main {
  def main(args: Array[String]): Unit = {
    var stu = new Stu
    val stu2 = new Stu

    // var 修改的变量指向的对象的值和引用均可改变
    stu.name = "james"
    stu = null

    // val 修饰的变量指向的对象的值可以改变,但是引用无法改变
    stu2.name = "simida"
    //    stu2 = null   // 报错
  }

}

class Stu {
  // 属性默认就是 public 权限
  var name = "cris"
}

能使用 val 就别使用 var !

因为改变变量引用指向的的工作量大大高于改变对象值的工作量,使用 val 关键字,底层编译器也会对其进行优化,效率更高!

3.2 数据类型

Scala 与 Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说scala没有java中的原生类型

Scala数据类型分为两大类 AnyVal(值类型) 和 AnyRef(引用类型), 注意:不管是AnyVal还是AnyRef 都是对象

相对于java的类型系统,scala要复杂些!也正是这复杂多变的类型系统才让面向对象编程和函数式编程完美的融合在了一起

val a = 12
println(a.toString) // 12

val result = 'a'.equals(a)
println(result) // false

3.3 数据类型体系图

  1. scala中一切数据都是对象,都是Any的子类

  2. scala中数据类型分为两大类 值类型(AnyVal) , 引用类型(AnyRef),不管是值类型还是引用类型都是对象

  3. scala数据类型仍然遵守低精度的值类型向高精度的值类型,自动转换(隐式转换)

  4. scala中有两个特殊的类型 Null , 它只有一个实例就是null, 在scala中,也叫bottom class

  5. scala中有个特殊的类型 Nothing, 它是用于在一个函数没有正常返回值使用 , 因为这样我们可以把抛出的返回值,返回给任何的变量或者函数

3.4 整数类型

Scala的整数类型就是用于存放整数值的,比如 12 , 30, 3456等等

整型的类型

数据类型 描述
Byte [1] 8位有符号补码整数。数值区间为 -128 到 127
Short [2] 16位有符号补码整数。数值区间为 -32768 到 32767
Int [4] 32位有符号补码整数。数值区间为 -2147483648 到 2147483647
Long [8] 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 = 2的(64-1)次方-1

建议:开发时,根据具体的业务选择合适的数据类型,做大数据最重要的就是细节,节省每一块内存,节省每一毫秒,这就是别人和你的差距!!!

  • Scala各整数类型有固定的表示范围和字段长度,不受具体OS的影响,以保证Scala程序的可移植性。

  • Scala的整型 常量/字面量 默认为 Int 型,声明Long型 常量/字面量 须后加‘l’’或‘L’

  • Scala程序中变量常声明为Int型,除非不足以表示大数,才使用Long

3.5 浮点数据类型

Scala的浮点类型可以表示一个小数,比如 123.4f,7.8 ,0.12等等

浮点型分类

Float [4] 32 位, IEEE 754标准的单精度浮点数
Double [8] 64 位 IEEE 754标准的双精度浮点数

浮点数据类型使用细节

    val num = 23.2e2 // 等价于 23.2 × 10^2
    println(num) // 2320.0
    val num2 = 23.2e-2 // 等价于 23.2 × 10^-2
    println(num2) // 0.232

    // 实际开发中,如果对精度要求很高,请一定使用 Duoble 数据类型,Float 数据类型最多精确到小数点后 7 位
    val num3 = 23.243454544334f
    val num4 = 23.243454544334
    println(num3) // 23.243454
    println(num4) // 23.243454544334

3.6 字符类型(Char)

字符类型可以表示单个字符,字符类型是Char, 16位无符号Unicode字符(2个字节), 区间值为 U+0000 到 U+FFFF

字符类型使用细节

  1. 字符常量是用单引号(‘ ’)括起来的单个字符。例如:var c1 = 'a‘ var c2 = '中‘ var c3 = ‘9’

  2. Scala 也允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如:var c3 = ‘\n’ // '\n’表示换行符

  3. 可以直接给Char赋一个整数,然后输出时,默认会按照对应的unicode 字符输出

  4. Char类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码

    var a = 'A'
    println(a) // A
    println(a.toInt) // 65
    println(a + 3) // 68
    println((a + 3).toChar) // D

    var b: Char = 65
    println(b) // A,Char 类型的数字输出默认根据 assii 表进行转换成对应的字符 

小思考

    var e: Char = 99 // 编译器只判断数值范围是否越界
    
    //var f : Char = 'a'+1  // 参与运算,自动转换为 Int 数据类型,将 Int =》 Char 有精度损失问题
    var n = 'a' + 1
    var n2: Char = ('a' + 1).toChar

字符型 存储到 计算机中,需要将字符对应的码值(整数)找出来

存储:字符——>码值——>二进制——>存储

读取:二进制——>码值——> 字符——>读取

3.7 布尔类型

布尔类型也叫Boolean类型,Booolean类型数据只允许取值true和false

boolean类型占1个字节。

boolean 类型适于逻辑运算,一般用于程序流程控制

3.8 Unit类型、Null类型和Nothing类型

Unit 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Null null , Null 类型只有一个实例值 null
Nothing Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。当一个函数,我们确定没有正常的返回值,可以用Nothing 来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性)
...
	var res = eat()
    println(res)  // ()

 	var result = exe()  // 任意数据类型都可以接收 Nothing 数据类型的数据
  }

  def eat(): Unit ={
    println("eat meat!")
  }

  def exe(): Nothing ={
    throw new Exception("这是异常")
  }

细节

  • Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal: 比如 Int, Float, Char, Boolean, Long, Double, Byte, Short)

  • Unit类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit类似于Java里的void。Unit只有一个实例,(),这个实例也没有实质的意义

  • Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容

3.9 值类型转换

当Scala程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换(隐式转换)

数据类型按精度(容量)大小排序为

自动类型转换细节说明

  1. 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。

  2. 当我们把精度(容量)大 的数据类型赋值给精度(容量)小 的数据类型时,就会报错,反之就会进行自动类型转换。

  3. (byte, short) 和 char之间不会相互自动转换。

  4. byte,short,char 他们三者可以计算,在计算时首先转换为int类型。

  5. 自动提升原则: 表达式结果的类型自动提升为 操作数中最大的类型

自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意

强制类型转换细节说明

  1. 当进行数据的 从 大——>小,就需要使用到强制转换

  2. 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级

  3. Char类型可以保存 Int的常量值,但不能保存Int的变量值,需要强转

  4. Byte和Short类型在进行运算时,当做Int类型处理。

var a = 12.3.toInt
println(a)  //12

var result = 10 * 3.4.toInt + 5 * 1.6.toInt
println(result) // 35
var result2 = (10 * 34 + 5 * 1.6).toInt
println(result2) // 348

var b : Char = result.toChar
var d : Char = 100

3.10 值类型和字符串的转换

在将String 类型转成 基本数据类型时,要确保String类型能够转成有效的数据,比如 我们可以把 “123” , 转成一个整数,但是不能把 “hello” 转成一个整数

把 “12.5” 转成 Int ? // 错误,在转换中,不会自动使用字符串的截取

3.11 标识符的命名规范

Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符 凡是自己可以起名字的地方都叫标识符

  1. Scala中的标识符声明,基本和Java是一致的,但是细节上会有所变化。

  2. 首字符为字母,后续字符任意字母和数字,美元符号,可后接下划线_

  3. 数字不可以开头。

  4. 首字符为操作符(比如+ - * / ),后续字符也需跟操作符 ,至少一个(反编译)

  5. 操作符(比如±*/)不能在标识符中间和最后.

  6. 用反引号....包括的任意字符串,即使是关键字(39个)也可以 [true]

    var ++ = 12
    println(++) // 12

    var `true` = false
    println(`true`)   // false

注意事项:

  1. 包名:尽量采取有意义的包名,简短,有意义

  2. 变量名、函数名 、方法名 采用驼峰法

标识符小测试

hello // ok

hello12 // ok

1hello // error

h-b // error

x h // error

h_4 // ok

_ab // ok

Int // ok , 因为在scala Int 是预定义的字符

Float // ok

_ // error ,因为在scala _ 有很多其他的作用。

Abc // ok

+*- // ok

+a // error

Scala 中的关键字

package, import, class, object, trait, extends, with, type, forSome

private, protected, abstract, sealed, final, implicit, lazy, override

try, catch, finally, throw

if, else, match, case, do, while, for, return, yield

def, val, var

this, super

new

true, false, null

你可能感兴趣的:(Scala,Scala,Spark,语言学习,基础语法,笔记整理)