1.常量与变量
Scala有两种变量,val和var。val类似于Java里的final变量。一旦初始化了,val就不能再被赋值。相反,var如同Java里面的非final变量,可以在它的生命周期中被多次赋值。
即,常量或变量。
// 1.1 var
scala> var a2 = 10
scala> a2 = 20
// 1.2 val
scala> val a1 = 10
scala> a1 = 20(此处会报错,因为val不允许初始化后再次修改a1变量的引用。)
// val定义的变量虽然不能改变其引用的内存地址,但是可以改变其引用的对象的内部的其他属性值。
// 为了减少可变性引起的bug,应该尽可能地使用不可变变量。变量类型可以省略,解析器会根据值进行推断。
// val和var声明变量时都必须初始化。
// 1.3 变量数据类型:
变量类型在变量名后面指定,前在equals之前签署。可以通过它的数据类型定义任何类型的Scala变量。
例如:val myVal :String;
// 1.4 类型推断:
当分配一个初始值给一个变量,Scala编译器可以计算出根据分配给它的值的变量类型。这就是所谓的变量类型推断。
例如:val myVal = "Hello, Scala!”;
// 1.5 多重任务:
Scala支持多任务。如果一个代码块或方法返回一个元组,该元组可被分配给一个val变量.
例如:val (myVar1: Int, myVar2: String) = Pair(40, "Foo")
2.数据类型
Scala 与 Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说scala没有java中的原生类型。
Scala数据类型分为两大类 AnyVal(值类型) 和 AnyRef(引用类型), 但不论是AnyVal还是AnyRef 都是对象。
相对于java的类型系统,scala要复杂些,也正是这复杂多变的类型系统才让面向对象编程和函数式编程完美的融合在了一起。
2.1 Scala 类型结构图
-
Scala中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any。统一类型,是Scala的又一大特点。更特别的是,Scala中还定义了几个底层类,比如Null和Nothing。
-
Null是所有引用类型的子类型,而Nothing是所有类型的子类型。Null类只有一个实例对象,null,类似于Java中的null引用。null可以赋值给任意引用类型,但是不能赋值给值类型。
-
Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于Nothing是其他任意类型的子类,他还能跟要求返回值的方法兼容。
-
Unit类型用来标识过程,也就是没有明确返回值的函数。 由此可见,Unit类似于Java里的void。Unit只有一个实例(),这个实例也没有实质的意义。
2.2 Scala 数据类型列表
3.调用函数与方法
在scala中,一般情况下我们不会刻意的去区分函数与方法的区别,但是他们确实是不同的东西。后面我们再详细探讨。首先我们要学会使用scala来调用函数与方法。
// 3.1 调用函数,求方根
scala> import scala.math._
scala> sqrt(100)
// 3.2 调用方法,静态方法(scala中没有静态方法这个概念,需要通过类对象来实现)
scala> BigInt.probablePrime(16, scala.util.Random)
// 3.3 调用方法,非静态方法,使用对象调用
scala> "HelloWorld".distinct
// 3.4 apply与update方法
apply方法是调用时可以省略方法名的方法。用于构造和获取元素:
"Hello"(4) 等同于 "Hello".apply(4)
Array(1,2,3) 等同于 Array.apply(1,2,3)
如:
println("Hello"(4))
println("Hello".apply(4))
在StringOps中你会发现一个 def apply(n: Int): Char方法定义。update方法也是调用时可以省略方法名的方法,用于元素的更新:
arr(4) = 5 等同于 arr.update(4,5)
如:
val arr1 = new Array[Int](5)
arr1(1) = 2
arr1.update(1, 5)
println(arr1.mkString(","))
// 3.5 option类型
Scala为单个值提供了对象的包装器,表示为那种可能存在也可能不存在的值。他只有两个有效的子类对象,一个是Some,表示某个值,另外一个是None,表示为空,通过Option的使用,避免了使用null、空字符串等方式来表示缺少某个值的做法。如:
val map1 = Map("Alice" -> 20, "Bob" -> 30)
println(map1.get("Alice"))
println(map1.get("Jone"))
4.标识符的命名规范
4.1 标识符概念
-
Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符。
-
凡是自己可以起名字的地方都叫标识符
4.2 标识符的命名规则
Scala中的标识符声明,基本和Java是一致的,但是细节上会有所变化。
-
首字符为字母,后续字符任意字母和数字,美元符号,可后接下划线_
-
数字不可以开头。
-
首字符为操作符(比如+ - * / ),后续字符也需跟操作符 ,至少一个(反编译)
-
操作符(比如+-*/)不能在标识符中间和最后.
-
用反引号`....`包括的任意字符串,即使是关键字(39个)也可以 [true]
4.3 Scala有39个关键字:
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
5.键盘输入语句
object InputCon {
def main(args: Array[String]): Unit = {
/*
要求:可以从控制台接收用户信息,【姓名,年龄,薪水】
*/
println("请输入姓名")
val name = StdIn.readLine()
println("请输入年龄")
val age = StdIn.readInt()
println("请输入薪水")
val sal = StdIn.readDouble()
printf("用户的信息为 name=%s age=%d sal=%.2f", name, age, sal)
}
}