Scala 學習(3)之「類——基本概念1」

小提示:能夠經過: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)	//若是定義方法時不帶括號,則調用方法時也能夠不帶括號

getter與setter方法

  • 定義不帶 parivate 的 var field,此時 scala 生成的面向 JVM 的類時,會定義爲 private 的字段,並提供 public 的 getter 和 setter 方法
  • 而若是使用 private 修飾 field,則生成的 getter 和 setter 也是 private 的
  • 若是定義 val field,則只會生成 getter 方法
  • 若是不但願生成 getter 和 setter 方法,則將 field 聲明爲 private[this]
// 小例子
class Student {
	var name = "0mifang"
}

//調用 getter 和 setter 方法,分別叫作 name 和 name_
val mifang = new Student
print(mifang.name)
jack.name = "mifang_edit"

自定義getter與setter方法

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的getter方法

若是你不但願 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!!")
	}
}

private[this]

若是將 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...")
		}
	}
}

在這裏插入圖片描述

Java風格的getter和setter方法

若是要讓 Scala 自動生成 Java 風格的 getter 和 setter 方法,只要給 field 添加 @BeanProperty 註解便可,此時會生成4個方法:this

  • name: String
  • name_ = (newValue: String): Unit
  • getName(): String
  • setName(newValue: String): Unit
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()

主constructor

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

輔助 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

相關文章
相關標籤/搜索