我剛剛瀏覽了Internet上的一些Scala教程,並注意到在某些示例中,在示例開始時聲明瞭一個對象。 html
Scala中的class
和object
什麼區別? app
一個對象只有一個實例(您不能調用new MyObject
)。 您能夠有一個類的多個實例。 spa
對象具備與 Java中的靜態方法和字段相同 (和一些其餘) 目的 。 scala
class C
定義一個類,就像在Java或C ++中同樣。 object O
建立一個單例對象O
做爲某個匿名類的實例; 它可用於保存與某些類的實例不相關的靜態成員。 object O extends T
使對象O
成爲trait T
的實例; 而後,您能夠將O
傳遞到任何一個預期爲T
位置。 class C
,那麼object C
是類C
的伴隨對象 ; 請注意,伴隨對象不是 C
的實例。 一般,您須要一個object
來保存無需首先實例化某個類的實例便可使用的方法和值/變量。 此用法與Java中的static
成員密切相關。 htm
object A { def twice(i: Int): Int = 2*i }
而後,您可使用A.twice(2)
調用上述方法。 對象
若是twice
是某個類A
的成員,那麼您須要首先建立一個實例: 繼承
class A() { def twice(i: Int): Int = 2 * i } val a = new A() a.twice(2)
您能夠看到這是多麼冗餘,由於twice
不須要任何特定於實例的數據。 教程
您也能夠將object
自己用做類或特徵的某些特殊實例。 當您執行此操做時,您的對象須要擴展某些trait
以使其成爲其子類的實例。 接口
考慮如下代碼:
object A extends B with C { ... }
該聲明首先聲明一個擴展B
和C
的匿名(不可訪問)類,並實例化名爲A
的此類的單個實例。
這意味着A
能夠傳遞給指望對象類型爲B
或C
或B with C
。
object
附加功能 Scala中還存在一些對象的特殊功能。 我建議閱讀官方文檔 。
class
是定義,描述。 它根據方法和其餘類型的組成來定義類型。
object
是單例-保證類的實例是惟一的。 對於代碼中的每一個object
,都會建立一個匿名類,該匿名類繼承自您聲明要實現的object
任何類。 從Scala源代碼中看不到此類,儘管您能夠經過反射來了解。
object
和class
之間有關係。 若是對象共享相同的名稱,則稱它們爲類的伴侶對象。 發生這種狀況時,每一個人均可以訪問另外一我的的private
可見性方法。 可是,這些方法不會自動導入。 您要麼必須顯式導入它們,要麼用類/對象名做爲前綴。
例如:
class X { // class X can see private members of object X // Prefix to call def m(x: Int) = X.f(x) // Import and use import X._ def n(x: Int) = f(x) private def o = 2 } object X { private def f(x: Int) = x * x // object X can see private members of class X def g(x: X) = { import x._ x.o * o // fully specified and imported } }
在Scala中定義對象就像在Java中定義僅具備靜態方法的類。 可是,在Scala中,對象能夠擴展另外一個超類,實現接口,而且能夠像類的實例同樣被傳遞。 (因此就像類上的靜態方法同樣,但效果更好)。
類和對象:類是一個定義,它描述實體或對象的全部屬性。 對象是類的實例。