####1. 类 #####1.1 类定义
class Counter {
private var value = 0 //初始化字段
def increment() { value += 1 } //默认方法是public
def current = value //没有参数的方法可以简写省去小括号
//对于改变对象状态的方法,如increment一般有(), 而类似取值器的方法则不需要,如current。
}
scala> val c = new Counter //或new Counter()
scala> c.current
scala> c.increment()
#####1.2 getter/setter方法 Scala默认对每个字段都提供了getter和setter方法,公有字段提供公有的getter和setter方法,私有字段提供私有的getter和setter方法。
class Person {
var age = 0
}
scala> val p = new Person
scala> p.age = 10
scala> p.age
res0: Int = 10
在Scala中,getter和setter方法并非命名为getXxx和setXxx,而是类似如下的两个方法:
class Person {
var theAge = 0
def age = theAge + 1
def age_=(newAge: Int): Unit = {
println("override age setter method.")
theAge = newAge
}
}
scala> val c = new Person
scala> c.age
res2: Int = 1
scala> c.age = 29
override age setter method.
c.age: Int = 30
从上面的例子可能不太好辨识到底对哪个属性的getter和setter方法,这里只是让我们明白,调用c.age
实际调用的是age这个getter方法,调用c.age=29
实际调用的是*age_=*这个setter方法。 注:val的字段默认只有getter方法。 #####1.3 构造函数 构造函数不是什么特殊的方法,他们是除了类的方法定义之外的代码。
class Calculator(brand: String) {
/**
* A constructor.
*/
val color: String = if (brand == "TI") {
"blue"
} else if (brand == "HP") {
"black"
} else {
"white"
}
// An instance method.
def add(m: Int, n: Int): Int = m + n
}
####2. object 对于java程序员来说,scala的object是一种特殊的语法结构,不同于java中对象的概念,接下来看它的用法。 #####2.1 static字段或方法 scala没有static字段或方法,可以使用object达到这个作用。
object Account {
private var number = 0
def getUniqueNumber = {
number += 1
number
}
}
#####2.2 伴生对象 对于既有实例方法又有静态方法的类,在scala中通过与类同名的“伴生”对象来实现。
class Account {
val id = Account.getNumber
private var balance = 0.0
def deposit(amount: Double): Unit = {
balance += amount
}
}
object Account {
var number = 0
def getNumber = {
number += 1
number
}
}
#####2.3 apply语法糖 在scala中,我们经常会使用类似函数调用的语法,例如:"abc"(1)
返回"b"。可以把这种用法理解为对()操作符的重载,而它的实现是通过调用当前类的伴生对象的apply方法来实现的。
class Account {
...
}
object Account {
def apply(initialBalance: Double) = {
println("apply run with parameter: " + initialBalance )
}
}
scala>Account(1000.0)
#####2.4 应用程序入口
object Hello {
def main(args: Array[String]): Unit = {
println("hello world.")
}
}
还可以使用扩展特质的办法
object Hello extends App {
println("hello world.")
}
如何需要命令行参数,还可以这样:
object Hello extends App {
if(args.length > 0)
println("hello " + args(0))
else
println("hello world.")
}