快學Scala(5) 類
阿新 • • 發佈:2018-12-30
1. 屬性
class Counter {
//屬性必須先初始化,不管是什麼型別
// 如果沒有訪問控制符,欄位私有,getter/setter方法是共有的
// getter與setter方法分別叫age與age_,可以自己重新定義
var age = 0
def age = 123
def age_=(newValue: Int) {
if( newValue > age ) age = newValue
}
// 對於私有欄位,setter/getter方法也是私有的
private var age2 = 0
// 一般私有變數,與Java一樣,允許同類型的其他物件訪問private物件
def isLess(other: Counter) = age2 < other.age2
// private[this]物件,只能本物件訪問,不允許其他同類型物件訪問
private[this] age3 = 0
//以下方法是錯誤的
//def isLess2(other: Counter) = age3 < other.age3
// 如果變數是val的,那麼只生成getter,不會生成setter
val age4 = 0
// @BeanProperty
// 需要先匯入import scala.reflect.BeanProperty
// 使用@BeanProperty會生成四個方法
// 1. name:String
// 2. name_ = (newValue: String): Unit
// 3. getName(): String
// 4. setName(newValue: String): Unit
@BeanProperty var name: String = _
}
2. 無引數方法
class Counter {
var value = 0
// 對於無引數方法,有兩種情況
// 1. 如果無引數方法定義後面有括號,如下
// 則呼叫時可以省略括號,也可以不省略
def increment() { value += 1 }
// 2. 如果無引數方法定義後面沒有括號,如下
// 則呼叫該方法是括號必須省略
def current = value
// 建議:對於值方法使用括號,對於取值方法省略括號
}
3. 構造器
// scala中構造器分為主構造器與輔助構造器
// 主構造器與輔助構造器的引數列表不能相同
class Person {
//輔助構造器名稱為this
//必須在第一行引用主構造器,或對先前已定義的其他輔助構造器
var name: String = "Irving"
def this(name: String) {
this()
// 不能呼叫之後的輔助構造器
this.name = name
}
def this(name: String, age: Int) {
this(name)
}
}
// 主構造器與類定義聯絡在一起
// 1. 主構造器引數的問題
// 1.1. 沒有使用var或val修飾:如果沒有方法引用該引數,則該引數不會被編譯為類的屬性;如果有方法引用引數,則該引數會被編譯為類的屬性
// 1.2. private與var/val同時修飾,私有欄位,且getter與setter都是私有方法
// 1.3. val/var修飾,私有欄位,會有共有的getter與setter方法。(val沒有setter方法)
// 1.4. @BeanProperty val/var 修飾,私有欄位,有四個構造器
// 2. 主構造器會執行類定義中的所有語句
// 3. 如果類名之後沒有引數,則該類具備一個無引數主構造器
// 4. 如果主構造器想變為私有,可以如下構造
class Person private {
}