Scala类,对象,案例类,文字

时间:2012-05-07 12:24:56

标签: oop scala smalltalk

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

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

4是一个对象吗?

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

功能是对象。他们也是课程的实例?这是如何组合在一起的?

Scala是纯粹的面向对象的Smalltalk还是它在OO前端做出了一些妥协?

2 个答案:

答案 0 :(得分:9)

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

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

  

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

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

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

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

在运行时,扩展AnyRef的所有内容都是幕后的对象,扩展AnyVal的所有内容都不是对象;它映射到基本类型。

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

答案 1 :(得分:3)

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

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

函数也不是对象,它们是扩展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>

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

不幸的是,与smalltalk相比,我不知道smalltalk能否做出scala oop纯度的假设。