### 1. 簡單的類和無參方法
- 類的定義及調用方法。所有類都是公有的。
~~~
class Counter {
private var age = 0 // 必須初始化字段
def incre() { // 方法默認是公用的
age += 1
}
def current() = age // 可以不帶()
}
//調用部分
val myCounter = new Counter // 或new Counter()
myCounter.incre()
println(myCounter.current) // 調用無參數方法()可以加上
~~~
- 風格定義:對于改值方法建議使用(),對于取值方法建議省略(),比如上面的current方法。
### 2. 帶getter和setter的屬性
-
getter和setter被稱為值得屬性,可以在方法里定義取值和改值具體限制。
-
在下面案例中`getter`和`setter`分別叫做`age`和`age_=`,如果下面定義的是私有變量,那么這兩個方法也是私有的。公有字段的這兩個方法是公有的。
~~~
class Person {
var age = 0
}
~~~
- 可以重新定義age和age_=,它們在調用時都是一樣的,都是直接用age就可以了。
~~~
class Counter {
private var Age = 0 // 必須初始化字段
def age_= (newAge: Int) {
if (newAge > Age) // 保證值不能變小
Age = newAge
else
println("不能使值變小!")
}
val myCounter = new Counter
myCounter.age = 10
myCounter.age = 3
println(myCounter.age)
~~~
-
Scala對每個字段都生成getter和setter方法,這些字段要被定義為**var**,若字段是**val**,只有getter方法生產。
-
Scala中不能只寫setter,不寫getter。(會報錯)
### 3. 對象私有字段
~~~
class Counter {
private var value = 0
def increament() {
value += 1
}
// 可以訪問另外一個對象的私有變量
def isLess(other: Counter) = value < other.value
}
~~~
- 要想限制上面的這種訪問對象私有變量,就必須將value定義成`private [this] var value = 0`,這種定義字段被成為對象私有字段,scala不會生成getter或setter方法。
### 4. Bean 屬性
- JavaBeans規范中把屬性定義為一對`getFoo/setFoo`方法。只要在scala字段標記@BeanProperty時,這樣的方法會自動生成。
~~~
import scala.reflect.BeanProperty
class Person {
@BeanProperty var name: String = _
}
~~~
- 字段生成方法:

### 5. 輔助構造器
-
scala中輔助構造器和Java中的構造函數對應。
-
輔助構造器名稱是this
-
輔助構造器必須以一個先前以一個已經定義的主構造器或其他輔助構造器的調用開始。
~~~
class Person {
private var name = ""
private var age = 0
def this(name: String) {
this() // 主構造器,沒有顯示定義就自動擁有一個無參主構造函數
this.name = name
}
def this(name: String, age: Int) {
this(name)
this.age = age
}
}
~~~
- 調用方法如下
~~~
var p1 = new Person
var p2 = new Person("Aaron")
var p3 = new Person("Aaron", 23)
~~~
### 6. 主構造器
-
每個類都有主構造器。
-
主構造器的參數直接放置在類名之后,可以使用默認參數,如age。
~~~
class Person(val name: String, val age: Int =0) {
...
}
~~~
-
主構造器會執行類中的所有語句。
-
如果類名后沒有參數,則該類是一個無名主構造器。
-
構造參數不帶val或var,這樣參數如何處理取決于它們在類中如何使用。
-
主構造器參數生成的字段和方法:

### 7. 嵌套類
~~~
import scala.collection.mutable.ArrayBuffer
class Network {
class Member(val name: String) {
val contacts = new ArrayBuffer[Member]
}
private val members = new ArrayBuffer[Member]
}
~~~
【待續】