Scala学习笔记 之 面向对象(OOP)

定义类(class)

在类中通过def定义函数,varval定义字段。
函数名可以是任何字符,如+,-,*,/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Persion(val firstName: String, val lastName: String) {

private var _age = 0
def age = _age
def age_=(newAge: Int) = _age = newAge

def fullName() = firstName + " " + lastName

override def toString() = fullName()
}

val obama: Persion = new Persion("Barack", "Obama")

println("Persion: " + obama)
println("firstName: " + obama.firstName)
println("lastName: " + obama.lastName)
obama.age_=(51)
obama.age = 51
println("age: " + obama.age)

上面的代码中,obama.age = 51被翻译为调用名为age_=的函数,参数为51

getters and setters

一个Scala源文件可以包含多个class,而且它们都具有public的可见性。

class的属性默认也是public的。

1
2
3
class Person {
var age = 0 // public by default
}

对于以上的代码,scala将会为JVM生成一个private age字段和public的getter和setter函数。如果age被声明为pirvate,则生成的getter和setter函数将是private的。
如果属性声明为val,则只会产生getter方法。
如果想声明一个只有getter方法的var,则需定义一个新的方法:

1
2
3
4
5
class Counter {
private var value = 0 // 将会生成private的getter和setter
def increment() { value += 1 }
def current = value // No () in declaration
}

以上的current则为getter方法。

在scala中,getter和setter方法的方法名分别为age和age_=,如下:

1
2
println(fred.age) // Calls the method fred.age()
fred.age = 21 // Calls fred.age_=(21)

@BeanProperty

在scala中,如果给class的字段加上@BeanProperty注解,则会产生JavaBean标准的getter和setter函数:

1
2
3
4
import scala.reflect.BeanProperty
class Person {
@BeanProperty var name: String = _
}

例如以上的代码会产生getNamesetName方法。

对象私有属性(Object-private)

对于一般私有属性,类的方法可以访问任何该类的对象的属性,如下:

1
2
3
4
5
6
class Counter {
private var value = 0
def increment() { value += 1 }
def isLess(other : Counter) = value < other.value
// Can access private field of other object
}

对象私有属性的定义格式为:private[this] var value = 0
将以上代码改为:

1
2
3
4
5
6
class Counter {
private[this] var value = 0
def increment() { value += 1 }
def isLess(other : Counter) = value < other.value // Error!
// Can access private field of other object
}

则无法访问other.value,编译器报错!
对于对象私有属性来说,编译器不会生成任何getter或setter函数。

object

object结构与class的区别:

  1. object是单例,相当于其成员都是static
  2. object的构造函数不能带参数