1. 程式人生 > >scala 伴生類和伴生物件的apply()問題

scala 伴生類和伴生物件的apply()問題

  • 伴生類與伴生物件的定義:
    單例物件與類同名時,這個單例物件被稱為這個類的伴生物件,而這個類被稱為這個單例物件的伴生類

  • 陣列原始碼例項:

伴生類和伴生物件是相互依存的,在我們呼叫陣列的時候,我們會發現我們有兩種初始化的模式:

模式一:

var z = new Array[String](3)
z(0) = "hadoop"; z(1) = "spark"; z(2) = "hive"

模式二:

var z = Array("Runoob", "Baidu", "Google")

模式二相對於模式一少了new這個類的過程,那麼為什麼會少這個過程?
我們可以先看一下原始碼:

def apply[T: ClassTag](xs: T*): Array[T] = {
    val array = new Array[T](xs.length)
    var i = 0
    for (x <- xs.iterator) { array(i) = x; i += 1 }
    array
  }

這是原始碼之中關於Array陣列實現的一部分,大部分大家可能看不懂,但是我們可以看到第一行有一個new這個關鍵字,所以可以說是apply方法實現了對Array的例項化,才讓我們可以使用模式二,而這就是apply方法在半生類和伴生物件中的作用。

  • 自制小例子
    • 程式碼:
class object_test(){
  println("hello class")
}
object object_test{
  def apply(): object_test = new object_test()
  println("hello object")
  def main(args: Array[String]): Unit = {
    var a=object_test()
  }
}
  • 執行結果:
hello object
hello class

Process finished with exit code 0

在程式碼中我們可以發現,apply()的作用就是返回伴生類的例項化。var a=object_test()

這句程式碼的()就是呼叫apply方法。

若澤大資料交流群:671914634