Scala 中直接的 object 定义代表的是单件模式,即只有一个对象存在,Scala中没有static
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world!")
}
}
在Scala中可以直接import Java中的包,import全部用_而不是*,因为*在Scala中可以作为方法名存在,import多个可以用{}
import java.util.{Date, Locale}
import java.text.DateFormat
import java.text.DateFormat._
在Scala中单参数方法可以用下面两种等价的方式调用
obj.method(var)
obj method var
在Scala中真正一切都是对象,包括内置类型和函数,大多说函数式编程语言都将函数作为一等公民对待,这可以参考函数式语言的相关资料
1 + 2 * 3 / x
等价于
(1).+(((2).*(3))./(x))
1的括号是必须的,否则1与.一起解释为1.0,成为了一个浮点数
函数当做对象在Java中的处理就是callback方法,注意Unit(uninterested)等价于void,函数的类型由参数和返回值决定
object Timer {
def oncePerSecond(callback: () => Unit) {
while (true) { callback(); Thread sleep 1000 }
}
def timeFlies() {
println("time flies like an arrow...")
}
def main(args: Array[String]) {
oncePerSecond(timeFlies)
}
}
在上例中直接使用匿名函数:
object TimerAnonymous {
def oncePerSecond(callback: () => Unit) {
while (true) { callback(); Thread sleep 1000 }
}
def main(args: Array[String]) {
oncePerSecond(() =>
println("time flies like an arrow..."))
}
}
注意在参数中直接使用匿名函数要用=>把参数列表和函数体分离开来,这里的()代表的是一个空的参数列表
Scala中的类可以含有参数,并且在Scala中可以不用明确指出类型,编译器可以推测出
class Complex(real: Double, imaginary: Double) {
def re() = real
def im() = imaginary
}
当方法不用参数时,在定义时可以省略括号,这样在调用时也就可以省略括号,就像直接访问类成员变量一样
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
}
Scala中类也组成了一颗继承树的结构,不同的是默认继承自scala.AnyRef
重载继承方法必须用override关键字明确指出
class Complex(real: Double, imaginary: Double) {
def re = real
def im = imaginary
override def toString() =
"" + re + (if (im < 0) "" else "+") + im + "i"
}