Scala的基本语法
Scala没有基本数据类型与包装类型的区分,统一都是类
类型层次结构
Any 是所有类的超类,处于类型继承结构最底层 。 AnyVal 是值类型的超类,像Byte、Int等数值类型都继承自它; AnyRef 是引用类型的超类,对应Java里的对象引用类型。 Nothing 是所有类型的子类型,可用于表示非正常终止或空值 ; Unit 类似于Java中的 void ,表示无值。
AnyRef:是Scala中所有引用类型的基类 ,对应Java里对象引用相关类型体系。
AnyVal:是所有值类型的基类 ,像Byte、Int等基本数值类型都继承自它。
Nothing:是所有类的子类,比较特殊,没有实际对象实例,但可用于类型定义。文中示例 scala> def foo = throw new RuntimeException ,这里 foo 的类型为 Nothing ,表示该方法会抛出异常非正常结束,没有正常返回值类型。
Null:是所有 AnyRef 的子类 , null 是其唯一对象,用于表示引用类型的空值。
变量定义
强类型语言与弱类型语言对比:以Java作为强类型语言示例,定义变量时需明确指定类型
变量与常量定义: var 用于定义可变变量,值可修改; val 用于定义不可变常量,值不可变,类似于Java中用 final 修饰的变量 。在Scala中鼓励使用 val 来定义变量,增强程序的不可变性和安全性。
基本操作符
算术操作符:Scala的算术操作符+ 、 - 、 * 、 / 、 % 等,以及逻辑操作符 & 、 | 、 ^ 、 >> 、 << 等,与Java的算术操作符功能类似。但在Scala中,这些操作符本质上是数据类型的方法,例如 1 + 1 等价于 1.+(1) 。还提到 1.to(10) 也可写成 1 to 10 这种中缀表示法。并且Scala没有 ++ 、 -- 操作符 ,要实现自增自减需使用 += 、 -= ,如 num += 1 。
字符串插值操作
插值器介绍:Scala有三个字符串插值器 s 、 f 、 raw 。
s 插值器:在任何字符串前加上 s ,可在字符串中直接使用变量,如 var name = "tom"; var src = s"hello ${name}" ,结果 src 为 "hello tom" 。
f 插值器:除具备 s 插值器功能外,还能进行格式化输出,在变量后用 % 指定输出格式 。
raw 插值器:对字面量中的字符不做编码处理,功能与 s 插值器类似 。
条件表达式基本形式
单分支和多分支 if - else :Scala中条件表达式有 if (单分支)、 if - else (多分支)两种基本形式。
支持混合类型表达式
Scala的条件表达式支持混合类型表达式,如 val z = if (x > 1) 1 else "error" ,当 x > 1 时 z 为 1 (整数类型),否则为 "error" (字符串类型),此时 z 的类型被推断为 Any ,它是 Int 和 String 的父类 。
缺失 else 情况
如果 if 表达式缺失 else 部分,相当于 if (x > 2) 1 else () ,这里 () 对应Scala中的 Unit 类,类似于Java中的 void 。
表达式都有值
在Scala中每个表达式都有值,像 val n = if (x > 2) 1 else () , n 的类型为 AnyVal ,值根据条件判断可能是 1 或 () 。
当条件表达式的结果类型可能为多种时,类型会被推断为合适的父类。如 val y = if(1>1) 1 else "error" , y 的类型为 Any ,因为结果可能是 Int 或 String ;若 val y = if(x>1) 1 (没有 else 部分), y 的类型为 AnyVal ,默认 else 部分为 () 。