Scala中對象和類之間的區別

我剛剛瀏覽了Internet上的一些Scala教程,並注意到在某些示例中,在示例開始時聲明瞭一個對象。 html

Scala中的classobject什麼區別? app


#1樓

一個對象只有一個實例(您不能調用new MyObject )。 您能夠有一個類的多個實例。 spa

對象具備 Java中的靜態方法和字段相同 (和一些其餘) 目的scala


#2樓

tl; dr

  • class C定義一個類,就像在Java或C ++中同樣。
  • object O建立一個單例對象O做爲某個匿名類的實例; 它可用於保存與某些類的實例不相關的靜態成員。
  • object O extends T使對象O成爲trait T的實例; 而後,您能夠將O傳遞到任何一個預期爲T位置。
  • 若是有class C ,那麼object C是類C伴隨對象 ; 請注意,伴隨對象不是 C的實例。

另請參閱Scala文檔以獲取對象code

用做靜態成員的主機

一般,您須要一個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 {
  ...
}

該聲明首先聲明一個擴展BC的匿名(不可訪問)類,並實例化名爲A的此類的單個實例。

這意味着A能夠傳遞給指望對象類型爲BCB with C

object附加功能

Scala中還存在一些對象的特殊功能。 我建議閱讀官方文檔

  • def apply(...)啓用A(...)的常規方法無名稱語法
  • def unapply(...)容許建立自定義模式匹配提取器
  • 若是附帶同名的類,則對象在解析隱式參數時將扮演特殊角色

#3樓

class是定義,描述。 它根據方法和其餘類型的組成來定義類型。

object是單例-保證類的實例是惟一的。 對於代碼中的每一個object ,都會建立一個匿名類,該匿名類繼承自您聲明要實現的object任何類。 從Scala源代碼中看不到此類,儘管您能夠經過反射來了解。

objectclass之間有關係。 若是對象共享相同的名稱,則稱它們爲類的伴侶對象。 發生這種狀況時,每一個人均可以訪問另外一我的的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
   }
}

#4樓

在Scala中定義對象就像在Java中定義僅具備靜態方法的類。 可是,在Scala中,對象能夠擴展另外一個超類,實現接口,而且能夠像類的實例同樣被傳遞。 (因此就像類上的靜態方法同樣,但效果更好)。


#5樓

類和對象:類是一個定義,它描述實體或對象的全部屬性。 對象是類的實例。

相關文章
相關標籤/搜索