1

只是试图让我了解 Scala 的基本概念。因此,每次使用关键字“new”实例化一个类时,我们都会得到一个新对象。用 object 关键字声明的单例对象不能用关键字“new”实例化,因为只能有一个。从某种意义上说,它是在编译时实例化的。

4 是 Int 的案例类吗?5.07是Double的案例类吗?

4是一个对象吗?

类本身有时是对象,还是总是对象?

函数是对象。它们也是类的实例?这如何结合在一起?

Scala 是否像 Smalltalk 一样纯粹面向对象,还是在 OO 方面做出了一些妥协?

4

2 回答 2

9

当您使用new运算符实例化一个类时,您将获得该类的一个新实例。新实例是一个对象。

object您可以使用关键字声明单例对象。说它在编译时被实例化并没有任何意义。对象仅在程序运行时存在,而不是在此之前(例如在编译程序时)。Anobject在第一次使用时被实例化。

4 是 Int 的案例类吗?5.07是Double的案例类吗?

No. 4 和 5.07 只是类IntDouble. 在 Scala 中,它们的行为方式与对象相同,但在幕后 4 和 5.07 并不是真正的对象。要理解这一点,您必须了解标准 Scala 类层次结构。

层次结构的顶部是类型Any。一切延伸AnyAny有两个直接子类型:AnyValAnyRef

  • AnyVal是所有值类型的超类型。值类型是映射到 JVM 原始类型的类型(例如:Int-> intDouble->double等)。
  • AnyRef是所有引用类型(“常规”对象)的超类型。

在运行时,所有扩展AnyRef的都是幕后的对象,而所有扩展AnyVal的都不是真正的对象;它映射到原始类型。

案例类只是一种语法糖。案例类与普通类完全相同,只是编译器会自动为您添加一些方法(例如,这使得它们适用于模式匹配)。

于 2012-05-07T13:07:39.420 回答
3

4 和 5.07 不是对象。它们只是IntDouble类的实例。在这里查看层次结构。

对象在编译时未实例化。当您第一次访问它时,它会被实例化(在对象主体/构造函数执行的意义上)。

函数也不是对象,它们是扩展 FunctionN 的匿名类的实例(例如Function2)。但是是的,有object,它提供了一些常见的实用程序,允许您编写:

//instance of Function2
scala> val sum = (x: Int, y: Int) => x+y
sum: (Int, Int) => Int = <function2>

scala> sum.curried
res0: Int => (Int => Int) = <function1>

// now back to uncurried version with Function object
scala> Function.uncurried(res0)
res1: (Int, Int) => Int = <function2>

如果您对普通类和案例类之间的区别感兴趣,请看这里

不幸的是,与 smalltalk 相比,我不知道 smalltalk 来假设 scala oop 纯度。

于 2012-05-07T12:47:39.990 回答