1. 程式人生 > >scala成長之路(4)compaion object——伴生對象的使用

scala成長之路(4)compaion object——伴生對象的使用

面向 aio tostring 直接 style rri spa eat 我們

雖然java一直聲稱自己是完全面向對象的語言,但一直以來都被很多人所質疑,其中java的靜態成員函數就是主要的“罪魁禍首”。由於java中保留了靜態方法的調用,導致其編程模式依然有過程式編程的可能,尤其是在靜態方法被濫用的當下(一個頑固的面向過程程序員完全可以將他的過程思維用一大推靜態方法實現,而class僅僅只是個空有其表的外殼而已)

所以在scala中,設計者摒棄了static關鍵字,宣稱自己是完全面向對象的,似乎更有說服力。。。

但是我們在編程中有時確實需要用到一般功能性函數,例如工具函數、工廠設計模式等。怎麽辦呢?compaion object(伴生對象)閃亮登場!

什麽是compaion object?很簡單,(一般在同一個文件中)同時定義了一個class,以及與這個class同名的object,那麽這個object就是這個class的伴生對象,這個class就是這個object的伴生類。。。是不是有點拗口,其實就可以看成命運共同體

啦╮(╯▽╰)╭

以class A,object A為例,有了compaion object之後,就可以將object A的作用域理解為靜態域,在該object A中定義的任何變量、常量、方法X,均可以在對應的訪問權限下通過A.X直接訪問;這兩個命運共同體的內部特殊點在於可以訪問彼此的私有成員,class A裏可以通過A.X訪問object的私有成員,而object中可以訪問某個class A對象的私有成員a.XX。註意這裏理解容易出錯,object A雖然是class A的伴生對象,但它不是A的對象,所以它本身不具備A的一切成員和方法,他只是一個特殊的作用域,因此它內部不能直接訪問class A的成員變量

talk is cheap, show you my code~

package basic.test
class Cat{ private var name = "Tom" private var age = 0 def run = println("A cat " + name + " is running...") def classify = println("It is a " + Cat.category)//註意這裏訪問了object Cat的私有成員 override def toString = "Cat{name:" + name + ",age:" + age + "}" } object Cat{
private val category = "Animal"
//如果這裏試圖在函數中直接訪問name、age,都報錯,例如
//def createCat = {
//  println(name + age)
//}//報錯無法找到name和age
def createCat
= { var res = new Cat res.name = "Created Tom"//註意這裏直接訪問修改class Cat的私有成員變量 res.age = 1//註意這裏直接訪問修改Cat的私有成員變量
     res
  } 
}

scala> import basic.test.Cat
import basic.test.Cat

scala> var a = new Cat
a: basic.test.Cat = Cat{name:Tom,age:0}

#這裏直接調用Cat的工廠方法 scala
> Cat.createCat res0: basic.test.Cat = Cat{name:Created Tom,age:1} scala> a.classify It is a Animal

上邊的例子一目了然,如果你還沒看懂,去看看本教程前邊的內容吧~

scala成長之路(4)compaion object——伴生對象的使用