一、scala特点
1.静态类型:变量声明后不允许改变类型;变量和表达式的类型在编译时就已经完全确定
2.强类型:不经过强转,数据类型不会被改变,不允许隐式类型转换。方式为(对象名.asinstanceOf[XXX],对象名.toXXX方法,隐式转换(implicit关键字))
3.多范式编程:
(1)面向对象:一切值都是对象;无static关键字使用伴生对象模拟类对象;无接口概念,用特质概念替代
(2)函数式编程:一切函数都是值,所以可以把函数作为参数和返回值
二、常量与变量
1.val:常量一旦初始化将不可以被修改
2.var:变量可以重复赋值
三、数据类型
1.值类型(AnyVal)
(1)直接存储值,在栈上存储其值
(2)与Java的八大基本类型一致(Byte、Short、Int、Long、Float、Double、Char、Boolean)
2.引用类型(AnyRef)
(1)存储对其值的引用,在栈上存储地址,堆上存储值
(2)List、Option等,已经自定义类
3.字面量:直接在代码中写常量值的方式:0,0L等等;符号字面量:’<标识符>’,对应scala.Symbol类型
4.特殊类型:
(1)Null:所有引用类型的子类,只有一个实例对象null,并且null为关键字
(2)Nothing:List()返回是List[Nothing]
(3)Unit:仅有一个实例对象“()”,无用占位符,类似Java的void。一切表达式都有值
四、scala字符串差值(拼接)
本质:隐匿转换的实现
1.s字符串插值,可以用$引用变量,也可以引用表达式
2.f字符串插值后格式化输出
3.raw插值,屏蔽转义符等控制效果
五、程序控制
1.条件控制:if
(1)if语句也是表达式,最终结果也必须有值,可以直接赋值
2.循环控制:for
(1)不可以声明i,也可以写做a、b等等;可以是作用域内现有变量
(2)<-为关键字非操作符
(3)表达式为数组、元祖、集合
(4)Scala中Range是常用的集合类型,表示范围区间
(5)单循环:for(i<- min to/until max by step){statements},从数值min开始以step作为步长行走直至max结束,to包含max,until不包含max。在条件后面可以加条件限制,比如下图中的if语句
(6)多重循环:for(i<-表达式1;j<-表达式2;…){statements},如果()内有多个表达式可以使用{}替代,换行写多条语句
(7)如果没有else则值为unit,即()
(8)循环跳转语句:
①scala中没有break,如要使用,需要导入包:import scala.util.control.Breaks._;
②break的源码如下,使用过异常机制实现跳出中断
③ ._相当于Java中的.*,是一种匹配通配符
(9)推导式:yield循环的结果输出生成集合Vector
①var arr = for(i<-1 to 20 if i%2==0) yield i
3.块表达式:{}
(1)块表达式也是一个结果,{}中的最后一行的结构就是块表达式的结果
(2)如果最后一行是赋值语句,则为unit()