一、Scala变量使用说明
变量声明基本语法
var | val 变量名 [: 变量类型] = 变量值
注意事项
- 声明变量时,类型可以省略(就是叫 类型推断)
- 类型确定后,就不能修改,说明Scala 是强数据类型语言.
- 在声明/定义一个变量时,可以使用var 或者 val 来修饰, var 修饰的变量可改变,val 修饰的变量不可改 [案例].(推荐使用val,线程安全,使用效率高)
- val修饰的变量在编译后,等同于加上final,
- var 修饰的对象引用可以改变,val 修饰的则不可改变,但对象的状态(值)却是可以改变的。(比如: 自定义对象、数组、集合等等) [分析val好处]
二、数据类型
scala数据类型介绍
- Scala 与 Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说scala没有java中的原生类型
- Scala数据类型分为两大类 AnyVal(值类型) 和 AnyRef(引用类型), 注意:不管是AnyVal还是AnyRef 都是对象。
- scala的数据类型一览图
对上面的数据类型的关系图的说明
- Any是所有类的根类型,即所有类的父类(基类)
- 在scala中类分为两个大的类型分支(AnyVal [值类型,即可以理解成就是java的基本数据类型], AnyRef类型)
- 在AnyVal 虽然叫值类型,但是仍然是类(对象)
- 在scala中有两个特别的类型(Null ), 还有一个是Nothing
- Null 类型只有一个实例 null, 他是bottom class ,是AnyRef的子类.
- Nothing 类型是所有类的子类, 它的价值是在于因为它是所有类的子类,就可以将Nothing类型的对象返回给任意的变量或者方法,比如案例
def f1():Nothing= { //表示f1方法就是没有正常的返回值,专门用于返回异常
throw new Exception("异常发生")
}
- 在scala中仍然遵守 低精度的数据自动的转成 高精度的数据类型。
- 在scala中,Unit 类型比较特殊,这个类型也只有一个实例 写成 ()
- 特点
相对于java的类型系统,scala要复杂些!也正是这复杂多变的类型系统才让面向对象编程和函数式编程完美的融合在了一起
scala数据类型列表
整数类型
整型的使用细节
- Scala各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证Scala程序的可移植性。
- Scala的整型 常量/字面量 默认为 Int 型,声明Long型 常量/字面量 须后加‘l’’或‘L’ [反编译看]
- Scala程序中变量常声明为Int型,除非不足以表示大数,才使用Long, 开发大数据时,我们的优化工作是点点滴滴.
浮点类型
基本介绍
Scala的浮点类型可以表示一个小数,比如 123.4f,7.8 ,0.12等等
浮点型的分类
浮点型使用细节
- 与整数类型类似,Scala 浮点类型也有固定的表数范围和字段长度,不受具体OS的影响。
Scala的浮点型常量默认为Double型,声明Float型常量,须后加‘f’或‘F’。
浮点型常量有两种表示形式
十进制数形式:如:5.12 512.0f .512 (必须有小数点)
科学计数法形式:如:5.12e2 => 5.12 乘以 10的2次方 5.12E-2 =》 表示5.12 除以 10的2次方
4) 通常情况下,应该使用Double型,因为它比Float型更精确(小数点后大致7位)
//测试数据 :2.2345678912f , 2.2345678912 // 2.7 与 8.1/3 //符指尾
字符类型(Char)
- 字符常量是用单引号(‘ ’)括起来的单个字符。例如:var c1 = 'a‘ var c2 = '中‘ var c3 = '9'
- Scala 也允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。例如:var c3 = ‘\n’ // '\n'表示换行符
- 可以直接给Char赋一个整数,然后输出时,会按照对应的unicode 字符输出 ['\u0061' 97]
- Char类型是可以进行运算的,相当于一个整数,因为它都对应有Unicode码.
布尔类型:Boolean
基本介绍
布尔类型也叫Boolean类型,Booolean类型数据只允许取值true和false
boolean类型占1个字节。
boolean 类型适于逻辑运算,一般用于程序流程控制[后面详解]:
if条件控制语句;
while循环控制语句;
do-while循环控制语句;
for循环控制语句
Unit类型、Null类型和Nothing类型
基本介绍
注意事项和细节说明
- Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal: 比如 Int, Float, Char, Boolean, Long, Double, Byte, Short)
- Unit类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit类似于Java里的void。Unit只有一个实例,(),这个实例也没有实质的意义
- Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容。
三、值类型转换
值类型隐式转换
- 介绍
当Scala程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换(隐式转换 implicit conversion)。
- 数据类型按精度(容量)大小排序为
- 自动类型转换细节说明
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
- 当我们把精度(容量)大 的数据类型赋值给精度(容量)小 的数据类型时,就会报错,反之就会进行自动类型转换。
- (byte, short) 和 char之间不会相互自动转换。
- byte,short,char 他们三者可以计算,在计算时首先转换为Int类型。
5.自动提升原则: 表达式结果的类型自动提升为 操作数中最大的类型
高级隐式转换和隐式函数
scala还提供了非常强大的隐式转换机制(隐式函数,隐式类,隐式值,implicity等等)
强制类型转换
- 介绍
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意。
- 案例演示
java : int num = (int)2.5
scala : var num : Int = 2.7.toInt //灵活
代码:
object DataTypeTrans {
def main(args: Array[String]): Unit = {
val b: Byte = 10
println(b.toInt)
val d: Double = 1.123
println(d.toByte)//潇洒 =》 潇傻 //Crm
}
}
- 强制类型转换细节说明
- 当进行数据的 从 大——>小,就需要使用到强制转换,注意有精度的损失
- 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
3.Char类型可以保存 Int的常量值,但不能保存Int的变量值,需要强转
4.Byte和Short类型在进行运算时,当做Int类型处理。