关于类:Scala – 类是否足够?

Scala - are classes sufficient?

来自Java的我对Scala的类/对象区分感到困惑。请注意,我不要求正式的区别;这已经足够了网上的参考资料解释了这一点,并有相关问题所以。

我的问题是:

  • 为什么斯卡拉的设计师选择做更多的事复杂(与Java相比)C?)我有什么缺点如果我忽略了这一区别只声明类?
  • 谢谢。


    Java类包含两种完全不同类型的成员——实例成员(例如EDCOX1(0))和静态成员(例如EDCOX1(1))。在scala中,只有实例成员。这实际上是一个简化!但这也留下了一个问题:我们应该把像valueOf这样的方法放在哪里?这就是对象有用的地方。

    1
    2
    3
    4
    5
    6
    7
    class BigDecimal(value: String) {
       def plus(that: BigDecimal): BigDecimal = // ...
    }

    object BigDecimal {
       def valueOf(i: Int): BigDecimal = // ...
    }

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

    1
    2
    3
    4
    class BigDecimal$object {
       def valueOf(i: Int): BigDecimal = // ...
    }
    lazy val BigDecimal = new BigDecimal$object

    在读取scala代码时,区分类型和值是至关重要的。我已将Intellij配置为突出显示蓝色类型。

    1
    2
    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) {},您至少需要一个对象!


    scala对标准类没有任何静态方法的概念,因此在这些场景中,您必须使用对象。这里的有趣文章提供了一个很好的介绍:

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

    (向下滚动到scala的statics类)


    一种方法就是这样。执行程序由对象和线程组成。线程在对象的上下文中执行代码——也就是说,线程总是在其中执行一个"this"对象。从Java的意义上讲,这是一个简化,在Java中,并不总是存在"这个"。但现在有一个鸡/蛋的问题。如果对象是由线程创建的,而线程是在对象内执行的,那么什么对象是最初在对象内执行的第一个线程。程序执行开始时必须存在一组非空的对象。这些是用object关键字声明的对象。