类的声明
Scala的OOP是可以创建类的。但类的声明过程与Java的不同。下面来看下在Scala里是怎么做的:
class
Person
|
看起来很简单——也是,我们只是声明了一个没什么功能的类。让我们继续看下该怎么来完善代码,使其成为一个更有实际用途的类。
主构造函数
我需要在对象创建的时候加几个特定的参数到Person类里面。你大概猜到了,我在说的是主构造函数。
class
Person(name: String, age: Int)
|
我们在创建对象时可以直接调用主构造函数,看下这个例子:
val p1 =
new
Person(
"Alex"
,
24
)
|
当然,主构造函数也可以被间接的调用在重载的构造器里。重载已经超出了本文的范畴,我会在以后的文章里来讨论它。
前缀的构造函数参数
好了,我们已经声明了Person类,它看起来也或多或少的有了些实际用处。它已经可以通过主构造函数来初始化一些参数。但我们初始化之后的这些参数是怎么交互的呢?
scala> p1.name
<console>:
10
: error: value name is not a member of Person
p1.name
|
正像你所看到的,想直接来获取Person实例里的name参数出错了。那是因为name参数在主构造函数声明那没有任何前缀。因此参数name和age都被默认声明成了私有的(private),所以在Person类的外部获取它们值时就出错了。
class
Person(val name: String, var age: Int)
|
我修改了下Person类的声明。现在参数name有了getter,因为它有一个前缀val。参数age在getter基础上还多了setter,因为它有一个前缀var(译者注:其实译者个人觉得把val和var分别理解为Java里加了final和没加final的变量更直观些)。
scala> val p2 =
new
Person(
"Bobby"
,
25
)
p2: Person = Person
@30374534
scala> p2.name
res1: String = Bobby
scala> p2.name =
"Bob"
<console>:
9
: error: reassignment to val
p2.name =
"Bob"
scala> p2.age
res2: Int =
25
scala> p2.age =
26
p2.age: Int =
26
|
在主构造函数里用上前缀val和var,让你的类更有实际功能了。
类的主体
让我们继续看下Scala里关于OOP的基础。我现在想展示下Scala的类可以有更实际的功能——当它们类的主体里多了一些函数时。
class
Person(val name:String, var age:Int) {
def introduce() =println(s
"Hi, my name is ${name}, I'm ${age} years old"
)
}
|
现在Person类的一个实例里,他/她变的更社交化了,可以把他/她自己介绍给别人了。看下面代码:
val p3 =
new
Person(
"Jhon"
,
33
)
p3.introduce
|
小结
在这篇文章里我试着对Scala里最简单和最基本的OOP用法做一个概述。在我印象中,Scala的OOP要比Java的更复杂——或者也不能说是更复杂,但它确实跟Java的有不同点,必须花上一些时间来适应它。