scala之旅-核心語言特性類(四)
類在Scala中是建立物件的藍圖。類可以包含方法、值、變數、型別、物件、特性和類,這些統統稱為類的成員。型別,物件和特性將在之後的章節介紹。
定義一個類
一個最小的類的定義,只需要一個簡單 class關鍵加上一個標誌符。類名的首字母應該要大寫。
class User val user1 = new User
關鍵字 new 被用來建立一個類的例項。 User類有一個預設的無參構造器,因為沒有定義任何構造器。 但是,你會經常要用到一個構造器以及一個類的主體。下面的例子就是定義一個有參構造器的類:
class Point(var x: Int, var y: Int) { def move(dx: Int, dy: Int): Unit= { x = x + dx y = y + dy } override def toString: String = s"($x, $y)" } val point1 = new Point(2, 3) println(point1.x) // 2 println(point1) // prints (2, 3)
這個 Point類有四個成員: 變數x和y 以及方法 move和toString 。不同於其他很多語言,主構造器位於類標誌上(var x: Int, var y: Int) 。其中 move 方法接收兩個整型引數並且返回 Unit值()。這個對應於類java語言中的void。 另一方面 toString 沒有接收任何引數但是返回了一個 String值。由於toString
重寫了AnyRef的
toString
,因此用關鍵字override
將其標記為。
構造器
構造器可以有可選引數來提供一個預設值,如下:
class Point(var x: Int = 0, var y: Int = 0) val origin = new Point // x and y are both set to 0 val point1 = new Point(1) println(point1.x) // prints 1
這也是提高清晰度的一個很好的做法
類的私有成員以及Getter/Setter語法
類的成員預設是public。使用 private 可以隱藏外部類對其訪問。
class Point { private var _x = 0 private var _y = 0 private val bound = 100 def x = _x def x_= (newValue: Int): Unit = { if (newValue < bound) _x = newValue else printWarning } def y = _y def y_= (newValue: Int): Unit = { if (newValue < bound) _y = newValue else printWarning } private def printWarning = println("WARNING: Out of bounds") } val point1 = new Point point1.x = 99 point1.y = 101 // prints the warning
在這裡的Point類,_x 和 _y 變數都是以私有的方式進行儲存的。使用 def x 和 def y 來獲取私有型別的訪問。def x_= 和 def y_= 是用來驗證賦值_x和_y的合法性的。注意這裡的setter的特殊語法: 在getter 方法標誌符後面加上一個 _= ,並且引數緊隨其後
主構造器裡面引數如果是public 可以用val和var修飾,但是因為val 是不可變的,所有你不能像如下這樣寫:
class Point(val x: Int, val y: Int) val point = new Point(1, 2) point.x = 3 // <-- does not compile
主構造器裡面的引數如果沒有用var或者val修飾,則是private,僅在類的內部可見
class Point(x: Int, y: Int) val point = new Point(1, 2) point.x // <-- does not compile