试图了解Scala的基本概念。因此,每次使用关键字“new”实例化Class时,我们都会获得一个新对象。使用object关键字声明的单个对象无法使用关键字“new”进行实例化,因为只能有一个。从某种意义上说,它是在编译时实例化的。
4是Int的案例类吗? 5.07是Double的案例类吗?
4是一个对象吗?
类本身有时候,还是总是对象?
功能是对象。他们也是课程的实例?这是如何组合在一起的?
Scala是纯粹的面向对象的Smalltalk还是它在OO前端做出了一些妥协?
答案 0 :(得分:9)
使用new
运算符实例化类时,将获得该类的新实例。新实例是一个对象。
您可以使用object
关键字声明单个对象。说它在编译时被实例化并没有任何意义。对象仅在程序运行时存在,而不是在此之前(例如编译程序时)。 object
在第一次使用时被实例化。
4是Int的案例类吗? 5.07是Double的案例类吗?
没有。 4和5.07只是类Int
和Double
的实例。在Scala中,它们的行为方式与对象相同,但幕后4和5.07并不是真正的对象。要理解这一点,您必须了解标准的Scala类层次结构。
层次结构的顶部是类型Any
。一切都延伸Any
。 Any
有两种直接的子类型:AnyVal
和AnyRef
。
AnyVal
是所有值类型的超类型。值类型是映射到JVM基元类型的类型(例如:Int
- > int
,Double
- > double
等。)。AnyRef
是所有引用类型(“常规”对象)的超类型。在运行时,扩展AnyRef
的所有内容都是幕后的对象,扩展AnyVal
的所有内容都不是对象;它映射到基本类型。
案例类只是一种语法糖。案例类与普通类完全相同,只是编译器会自动为您添加一些方法(例如,它们适合于模式匹配)。
答案 1 :(得分:3)
4和5.07不是对象。它们只是Int和Double类的实例。查看层次结构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纯度的假设。