Understanding class and object in scala
我对斯卡拉非常陌生,现在我要做一个在Scala和JAVA中都写的项目。我遇到了这样的结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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中的EDCOX1,1个对象定义一些映射。
但在这个例子中,class和object扩展了不同的trait,这就是我真正困惑的地方。我无法想象这意味着什么,为什么要使用它。
- 型你的问题到底是什么?
- 型我们不能把对象看作带有抽象方法的类。对象只是单例。
- 型因为jvm对象是(不完全是)一个常规类,比如说SomeObject。但是scala还生成了另一个包含instance = new SomeClass()的静态值类,所以当您访问SomeObject.someMethod时,实际上是在调用instance.someMethod。
- 型您引用的答案说,将对象视为"隐式定义的类的单例"。也就是说,它也是一个对象。也许下面的链接可以帮助您:docs.scala-lang.org/tutorials/tour/singleton-objects.html。最值得注意的是,它说"scala中没有静态关键字"。因此,对象在Java程序员认为静态的地方使用。为什么不同?他们来自不同的思想流派。Scala深受Haskell的影响,Java受到C/C++的严重影响。
我将试着从一个知道Java的人的角度来解释Scala EDOCX1 0。
在爪哇中,可以定义"正常"类成员和EDCOX1×1类成员。当Java中的某个成员(例如成员变量)是EDCOX1(1)时,该成员变量只有一个实例,该实例由该类的所有实例共享。
在scala中,没有static。与Java相比:无论你在爪哇中使用EDOCX1×1,你都可以在斯卡拉放一个EDCOX1×0。
一个Scala EDCOX1(0)是一个单独的实例,它只有一个实例,就像在Java中只有一个实例的EDCOX1和1个成员一样。
我希望这能更清楚地说明scala-object到底是什么。
scala-object可以像其他类或特性一样扩展类或特性,从而继承它所扩展的类或特性中定义的任何内容。这真的没有理由不可能。
请注意,如果您有一个同名的class和一个同名的object,那么这两个就属于一起——他们可以看到彼此的私人成员。object被称为类的伴生对象。
注意,这并不意味着object是类的一个实例。它不是-它是一个独立的东西站在班级旁边。也许你对扩展不同特性的类和对象的困惑来自于对这一点的误解。