[英]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>
對象定義一些映射。
但是在此示例中, class
和object
擴展了不同的 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.