Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的。
我们可以认为 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递。
类,对象,方法,实例变量的概念:
对象 - 对象有属性和行为。例如:一只狗的状属性有:颜色,名字,行为有:叫、跑、吃等。对象是一个类的实例。
类 - 类是对象的抽象,而对象是类的具体实例。
方法 - 方法描述的基本的行为,一个类可以包含多个方法。
字段 - 每个对象都有它唯一的实例变量集合,即字段。对象的属性通过给字段赋值来创建。
两种编程模式:
交互式编程, 不需要写脚本,直接命令行输入;
脚本模式写脚本文件,然后scalac 编译,scala 执行。
scala 换行符:
Scala是面向行的语言,语句可以用分号(;)结束或换行符。Scala 程序里,语句末尾的分号通常是可选的。如果你愿意可以输入一个,但若一行里仅有一个语句也可不写。另一方面,如果一行里写多个语句那么分号是需要的。
Scala 非常简洁:比较Java 和 Scala 里是如何写类及构造函数的。
// 在 Java 里
class MyClass {
private int index;
private String name;
public MyClass(int index, String name) {
this.index = index;
this.name = name;
}
}
//在 Scala 里
class MyClass(index: Int, name: String)
根据这段代码,Scala编译器将制造有两个私有字段的类,一个名为 index 的 Int 类型和一个叫做 name 的 String 类型,还有一个用这些变量作为参数获得初始值的构造函数。这个构造函数还将用作为参数传入的值初始化这两个字段。
有助于 Scala 的简洁易懂的另一个因素是它的类型推断。重复的类型信息可以被忽略,因此程序变得更有条理和易读。
函数式风格:Scala 允许你用指令式风格编程,但是鼓励你采用一种更函数式的风格。
通向更函数式风格路上的第一步是识别这两种风格在代码上的差异。
如果代码包含了任何 var 变量,那它大概就是指令式的风格。如果代码根本就没有var ——就是说仅仅包含 val ——那它大概是函数式的风格。因此向函数式风格推进的一个方式,就是尝试不用任何 var 编程。
// 指令式风格:
def printArgs(args: Array[String]): Unit = {
var i = 0
while (i < args.length) {
println(args(i))
i += 1
}
}
// 可以通过去掉 var 的办法把这个代码变得更函数式风格:
def printArgs(args: Array[String]): Unit = {
for(arg <- args):
println(arg)
}
// 或者这样
def printArgs(args: Array[String]): Unit = {
args.foreach(println)
}
面向对象 :Scala 是纯粹格式的面向对象语言:每个值都是对象,每个操作都是方法调用。
Scala 比 Java 更面向对象的一个方面是 Scala 没有静态成员。Scala 有单例对象: singleton object。除了用 object 关键字替换了 class 关键字以外,单例对象的定义看上去就像是类定义。
import scala.collection.mutable.Map
object ChecksumAccumulator {
private val cache = Map[String, Int]()
def calculate(s: String): Int =
if (cache.contains(s))
cache(s)
else {
val acc = new ChecksumAccumulator
for (c <- s)
acc.add(c.toByte)
val cs = acc.checksum()
cache += (s -> cs)
cs
}
}
类和单例对象间的一个差别是,单例对象不带参数,而类可以。因为你不能用 new 关键字实例化一个单例对象,你没机会传递给它参数。每个单例对象都被作为由一个静态变量指向的虚构类:synthetic class的一个实例来实现,因此它们与Java静态类有着相同的初始化语法。 特别要指出的是,单例对象会在第一次被访问的时候初始化。