小提示:能夠經過
:paste
進入 Scala 的多行模式,輸入對應的代碼塊以後,按ctrl + D
退出多行模式,而後再調用剛纔輸入的函數或者方法進行測試編程
//定義類,包含 field 以及方法 class HelloWorld { private var name = "0mifang" def sayHello() {print("Hello, " + name)} def getName = name } //建立類對象,並調用其方法 val helloWorld = new HelloWorld helloWorld.sayHello() print(helloWorld.getName) //若是定義方法時不帶括號,則調用方法時也能夠不帶括號
// 小例子 class Student { var name = "0mifang" } //調用 getter 和 setter 方法,分別叫作 name 和 name_ val mifang = new Student print(mifang.name) jack.name = "mifang_edit"
class Student { private var myName = "omifang" def name = "your name is " + myName //自定義getter方法 def name_=(newName: String): Unit = { //自定義setter方法,使其沒法修更名字 print("you cannot edit your name!!!") } } val student = new Student print(student.name) student.name = "0mifang_edit"
若是你不但願 field 有 setter 方法,則能夠定義爲 val,可是此時就不再能更改 field 的值了,若是但願可以僅僅暴露出一個 getter 方法,而且還能經過某些方法更改 field 的值,那麼須要綜合使用 private 以及自定義 getter 方法,此時,因爲 field 是 private 的,因此 setter 和 getter 都是 private,對外界沒有暴露,本身能夠實現修改 field 值的方法,本身能夠覆蓋 getter 方法。函數
class Student { private var myName = "0mifang" def name = "your name is " + myName //定義getter方法 def updateName(newName:String): Unit = { //定義方法提醒用戶沒法修更名字 if(newName == "0mifang") myName = newName else print("not accept this new name!!") } }
若是將 field 使用 private 來修飾,那麼表明這個 field 是類私有的,在類的方法中,能夠直接訪問類的其餘對象的 private field 。這種狀況下,若是不但願 field 被其餘對象訪問到,那麼可使用private[this],意味着對象私有的 field ,只有本對象能夠訪問到。測試
class Student { private[this] var myAge = 0 def age = myAge //定義getter方法 def age_=(newAge: Int): Unit = { //定義setter方法 if(newAge > 0) myAge = newAge else print("illegal age!!") } def older(s:Student): Unit = { //當使用了parivate[this]以後,這個方法就失去了意義 if (myAge > s.myAge) { print("I'm older than him...") } } }
若是要讓 Scala 自動生成 Java 風格的 getter 和 setter 方法,只要給 field 添加 @BeanProperty 註解便可,此時會生成4個方法:this
import scala.beans.BeanProperty // 方法一 class Student { @BeanProperty var name: String = _ } val s = new Student s.setName("0mifang") s.getName() // 方法二 class Student(@BeanProperty var name: String) val s = new Student("0mifang") s.getName()
class Student(val name: String, val age: Int): Unit = { println("your name is " + name + ", your age is " + age) } //主 constructor 中還能夠經過使用默認參數,來給參數默認的值 class Student(val name: String = "0mifang", val age: Int = 18): Unit = { println("your name is " + name + ", your age is " + age) } //若是主 constrcutor 傳入的參數什麼修飾都沒有,好比 name: String ,那麼若是類內部的方法使用到了,則會聲明爲 private[this] name ;不然沒有該 field ,就只能被 constructor 代碼使用而已
輔助 constructor 之間能夠互相調用,可是必須第一行調用主 constructorscala
class Student { private var name = "" private var age = 0 def this(name: String) { this() //調用父類的constructor this.name = name } def this(name: String, age: Int) { this(name) //調用上面定義的輔助constructor this.age = age } }
歡迎關注,本號將持續分享本人在編程路上的各類見聞。code