簡體   English   中英

了解Scala中的類和對象

[英]Understanding class and object in scala

我對scala還是很陌生,現在我必須從事一個用scala和java編寫的項目。 我遇到了這樣的結構:

class SomeType{
    //...
}

trait Trait1 extends scala.AnyRef{
}

trait Trait2 extends extends scala.AnyRef{
}

class MyClass(arg : SomeType) extends Trait1{
    //...
}

object MyClass extends Trait2{
    //...
}

這有點麻木。 據我閱讀的答案,我們可以將object視為具有抽象方法的類。 即,我們可以(在我看來)使用Java中的Class<T>對象定義一些映射。

但是在此示例中, classobject擴展了不同的 trait 這就是我真正的困惑。 我無法想象它的含義以及為什么使用它。

我將嘗試從了解Java的人的角度解釋Scala object是什么。

在Java中,您可以定義“普通”類成員和static類成員。 當Java中某些東西(例如成員變量)是static時,則該成員變量只有一個實例,該類的所有實例都共享該實例。

在Scala中,沒有static 相比於Java的:無論你會使static在Java中,你將提出一個object在Scala中。

Scala object是一個單例object只有一個實例,就像Java中的static成員一樣,它只有一個實例。

我希望這可以使一個Scala object的確切含義更加清楚。

Scala object可以像其他任何類或特征一樣擴展類或特征,以便它繼承其擴展的類或特征中定義的任何內容。 確實沒有理由為什么這不可能。

請注意,如果您有一個同名的class和一個object ,則這兩個對象屬於同一class -他們可以看到彼此的私有成員。 object稱為類的伴隨對象

請注意,這並不意味着該object是類的一個實例。 不是-它是類的另一部分。 也許您對類和對象具有不同特征的困惑來自對這一點的誤解。

一門課就像其他語言的其他課一樣。 您可以像定義任何其他語言一樣定義類,就像其他任何語言一樣。 此外,還提供了一些案例類 ,這些案例類定義了一些方便的方法,可以輕松地初始化對象。

class Person(val name: String)
val me = new Person("My name")

但是,對象是僅具有單個對象的類。 這使它很有趣,因為它可用於使用伴隨對象創建類的靜態成員。 此伴隨對象可以訪問類定義的私有成員,並且與您定義的類具有相同的名稱。

class Person(var name: String) {

  import Person._

  def hi(): String = sayHello(name)
}

object Person {
  private def sayHello(name: String): String = "Hello " + name
}

val me = new Person("My name")
me.hi()

另外,值得注意的一點是對象類是延遲創建的,這是另一個重要點。 因此,除非我們的代碼中需要它們,否則它們不會被實例化。

如果要為JDBC定義連接創建,則可以在對象內部創建它們以避免重復,就像在Java中使用單例對象一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM