来自 Java,我对 scala 的类/对象区别感到困惑。
请注意,我不要求形式上的区别;有足够的
网络上的引用资料解释了这一点,并且有相关的问题
SO .
我的问题是:
选择让事情变得更多
复杂(与 Java 或
C#)?我有什么缺点
期待我是否忽略这种区别
并只声明类?
谢谢。
最佳答案
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 中消除的另一种复杂程度——字段和方法之间的区别。接口(interface)上不允许有字段,除非它们是静态的和最终的;方法可以被覆盖,如果在子类中重新定义,字段会被隐藏。 Scala 消除了这种复杂性,只向程序员公开方法。
最后,对你的第二个问题的一个 glib 答案:如果你不声明任何对象,你的程序可能永远不会运行,因为你定义了
public static void main(String... args) {}
的等价物在 Scala 中,您至少需要一个对象!
关于Scala - 类就足够了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3128217/