来自Java我对scala的类/对象区别感到困惑。 请注意,我不要求正式的差异;有足够的 网上的参考文献解释了这一点,并且有相关的问题 SO。
我的问题是:
感谢。
答案 0 :(得分:23)
Java类包含两种完全不同类型的成员 - 实例成员(例如BigDecimal.plus
)和静态成员(例如BigDecimal.valueOf
)。在Scala中,有仅实例成员。这实际上是一种简化!但它留下了一个问题:我们在哪里放置像valueOf
这样的方法?这就是对象有用的地方。
class BigDecimal(value: String) {
def plus(that: BigDecimal): BigDecimal = // ...
}
object BigDecimal {
def valueOf(i: Int): BigDecimal = // ...
}
您可以将此视为匿名类的声明及其单个实例:
class BigDecimal$object {
def valueOf(i: Int): BigDecimal = // ...
}
lazy val BigDecimal = new BigDecimal$object
在阅读Scala代码时,区分类型与值是至关重要的。我已将IntelliJ配置为蓝色高亮类型。
val ls = List.empty[Int] // List is a value, a reference the the object List
ls: List[Int] // List is a type, a reference to class List
Java还有另一种复杂性,在Scala中被删除 - 字段和方法之间的区别。接口上不允许使用字段,除非它们是静态的和最终的;方法可以被覆盖,如果在子类中重新定义,则隐藏字段。 Scala消除了这种复杂性,只向程序员公开了方法。
最后,对你的第二个问题回答:如果你没有声明任何对象,你的程序可能永远不会运行,因为你要在Scala中定义等效的public static void main(String... args) {}
,你至少需要一个对象!
答案 1 :(得分:2)
Scala没有任何带有标准类的静态方法的概念,所以在这些场景中你必须使用对象。这里有趣的文章提供了一个很好的介绍:
http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-3
(向下滚动到Scala的Sort-of Statics)
答案 2 :(得分:0)
一种看待它的方法就是这样。执行程序由对象和线程社区组成。线程在对象的上下文中执行代码 - 即,总是存在线程正在其中执行的“this”对象。这是Java的简化,在Java中,并不总是存在“这个”。但现在有一个鸡/蛋问题。如果对象是由线程创建的,并且线程是在对象中执行的,那么哪个对象是最初在其中执行的第一个线程。在程序执行开始时必须存在一组非空对象。这些是使用object
关键字声明的对象。