Scala - 课程足够吗?

时间:2010-06-27 17:42:39

标签: scala class

来自Java我对scala的类/对象区别感到困惑。 请注意,我不要求正式的差异;有足够的 网上的参考文献解释了这一点,并且有相关的问题 SO

我的问题是:

  1. 为什么scala的设计师 选择做更多的事情 复杂(与Java或。相比) C#)?我有什么缺点 我希望如果忽略这种区别 并且只声明类?
  2. 感谢。

3 个答案:

答案 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关键字声明的对象。