好程式設計師大資料教程Scala系列之類

好程式設計師IT發表於2019-10-22

好程式設計師大資料教程Scala 系列之

1.  類的定義

Scala 訪問修飾符基本和Java的一樣,分別有:private,protected,public。

如果沒有指定訪問修飾符符,預設情況下,Scala 物件的訪問級別都是 public。

私有(Private)成員

 private 關鍵字修飾,帶有此標記的成員僅在包含了成員定義的類或物件內部可見,同樣的規則還適用內部類。

class Outer{
     class Inner{
     private  def f(){println("f")}
     class InnerMost{
        f()  //  正確
        }
    }
    ( new Inner).f()  // 錯誤
}

 (new Inner).f( ) 訪問不合法是因為  f   Inner 中被宣告為 private,而訪問不在類 Inner 之內。

但在 InnerMost 裡訪問  f  就沒有問題的,因為這個訪問包含在 Inner 類之內。

Java中允許這兩種訪問,因為它允許外部類訪問內部類的私有成員。

保護(Protected)成員

   scala 中,對保護(Protected)成員的訪問比 java 更嚴格一些。因為它只允許保護成員在定義了該成員的的類的子類中被訪問。而在java中,用protected關鍵字修飾的成員,除了定義了該成員的類的子類可以訪問,同一個包裡的其他類也可以進行訪問。

package p{
class Super{
     protected  def f() {println("f")}
    }
     class Sub  extends Super{
        f()
    }
     class Other{
        ( new Super).f()  // 錯誤
    }
}

類的定義示例:

// 定義 Point 類,構造器帶有兩個引數
class Point( var x: Int,  var y: Int) {

     // 無返回值的類方法
   def move(dx: Int, dy: Int): Unit = {
    x = x + dx
    y = y + dy
  }

     // 沒有引數但是返回值為 String 型別的重寫方法
   override  def toString: String =
    s"($x, $y)"
}

// 建立類的例項
val point1 =  new Point(2, 3)
point1.x   // 2
println(point1)   // prints (2, 3)

構造器可以帶有預設值:

class Point( var x: Int = 0,  var y: Int = 0){
...
}
val origin =  new Point   // x, y 都取預設值 0
val point1 =  new Point(1) //x=1,y=0
println(point1.x)   // prints 1

私有成員變數以及重新定義的Getter/Setter方法:

  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

類定義中的其他細節:

// Scala 中,類並不用宣告為 public
//Scala 原始檔中可以包含多個類,所有這些類都具有公有可見性。
class Person {
   // val 修飾的變數是隻讀屬性的,只帶 getter 方法但沒有 setter 方法
   // (相當與 Java 中用 final 修飾的變數)
   // 欄位必須初始化
   val id = "1234"

   // var 修飾的變數,預設同時有公開的 getter 方法和 setter 方法
   var age: Int = 18

   // 類私有欄位 , 有私有的 getter 方法和 setter 方法,只能在類的內部使用
   private  var name: String = " 王老五 "

   // 物件私有欄位 , 訪問許可權更加嚴格的, Person 類的方法只能訪問到當前物件的欄位
   private[ thisval hobby = " 旅遊 "
}

scala中,在實現屬性時你有如下四個選擇:

var foo: Scala自動合成一個getter和一個setter

val foo: Scala自動合成一個getter

由你來定義foo和foo_=方法

由你來定義foo方法

2.  構造器

注意:

1.主構造器會執行類定義中的所有語句

2.主構造器如果有引數直接放置在類名之後

 class ConstructorDemo ( val id: Int ) { … }

3.主構造器變成私有的,可以像這樣放置private關鍵字:

 class ConstructorDemo private ( val id: Int ) { … }

  此時,使用者必須透過輔助構造器來構造Person物件

class ConstructorDemo {

   private  var var1 = ""

   private  var var2 = 0

   // 輔助構造器 1
   def  this(var1:String) {
     this()   // 呼叫主構造器
     this.var1 = var1
  }

   // 輔助構造器 2
   def  this(var1:String, var2:Int) {
     this(var1)  // 呼叫輔助構造器 1
     this.var2 = var2
  }

}

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2660968/,如需轉載,請註明出處,否則將追究法律責任。

相關文章