1. 程式人生 > 實用技巧 >scala之旅-核心語言特性類(四)

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重寫了AnyReftoString,因此用關鍵字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