Scala - 课程足够吗?

Joh*_*ohn 7 scala class

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

我的问题是:

  1. 为什么scala的设计者选择使事情变得更复杂(与Java或C#相比)?如果忽略这种区别并仅声明类,我还有什么不利之处?

谢谢.

ret*_*nym 23

Java类包含两种完全不同类型的成员 - 实例成员(例如BigDecimal.plus)和静态成员(例如BigDecimal.valueOf).在Scala中,只有实例成员.这实际上是一种简化!但它留下了一个问题:我们在哪里放置类似的方法valueOf?这是对象有用的地方.

class BigDecimal(value: String) {
   def plus(that: BigDecimal): BigDecimal = // ...
}

object BigDecimal {
   def valueOf(i: Int): BigDecimal = // ...
}
Run Code Online (Sandbox Code Playgroud)

您可以将其视为匿名类的声明及其单个实例:

class BigDecimal$object {
   def valueOf(i: Int): BigDecimal = // ...
}
lazy val BigDecimal = new BigDecimal$object
Run Code Online (Sandbox Code Playgroud)

在阅读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
Run Code Online (Sandbox Code Playgroud)

Java还具有Scala中删除的另一个复杂程度 - 字段和方法之间的区别.接口上不允许使用字段,除非它们是静态的和最终的; 方法可以被覆盖,如果在子类中重新定义,则隐藏字段.Scala消除了这种复杂性,只向程序员公开了方法.

最后,回答你的第二个问题:如果你没有声明任何对象,你的程序可能永远不会运行,因为你要public static void main(String... args) {}在Scala中定义等价物,你至少需要一个对象!

  • 请注意,如果你有一个名为`Something`的类和一个名为`Something`的对象(在同一个包中),那么这两个是相互关联的 - 对象是类的*伴侣对象*,两者可以看到每个其他人的私人会员.将其与Java进行比较:将类中的方法视为实例方法,将对象中的方法视为属于该类的静态方法. (3认同)

Roy*_*ove 2

Scala 没有任何带有标准类的静态方法的概念,因此在这些情况下您必须使用对象。这里有一篇有趣的文章,提供了很好的介绍:

\n\n

http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-3

\n\n

(向下滚动到 Scala\xe2\x80\x99s 静态排序)

\n