1. 程式人生 > >快學Scala(5) 類

快學Scala(5) 類

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 {
}