3. 统一的对象模型
Scala采用了一种纯粹的面向对象的模型,如同Smalltalk一样:每一个值都是对象,每一个操作都是消息传递。
3.1. 类(Classes)
图1(原文为Figure 2,但图上是Figure 1——译注)展示了Scala的类层次结构。每一个类都继承自scala.Any,Any的子类可以划分为两个主要范畴(Categories),值类型(values classes)继承自scala.AnyVal,引用类型(reference classes)继承自scala.AnyRef。每一种Java的基本数据类型都对应于一种值类型,通过预定义的类型别名进行映射,而AnyRef则对应于Java环境中的根类:java.lang.Ojbect。引用类型的实例一般是通过指向堆中的一个对象的指针来实现的,而值类型则是直接表示的,不通过指针引用。两种类型对象可以相互转换,例如将一个值类型实例看做是根类Any的实例时,此时的装箱(boxing)操作及其逆操作是自动完成的,无需额外编码。
需要注意的是,值类型的类空间是平面的,即所有值类型继承自scala.AnyVal,但他们相互之间没有继承关系。作为替代,值类型之间有视图(即隐式类型转换,详见第9节)。我们曾经考虑另一种方式,即值类型之间相互继承,例如可以让Int类型继承自Float,而不是采用隐式类型转换。最终我们没有这样选择,主要是因为我们希望保持一点:将一个值解释为一个子类型的实例时,其表现形式不应与将其解释为其父类型的实例时相异。此外,我们还希望保证:对于任意两个类型S<:T(S是T的子类型——译注),S的每一个实例都应当满足:
x.asInstanceOf[T].asInstanceOf[S] = x
(由于浮点数是非精确表示的,因此类型转换有可能带来精度的损失,例如:目前Scala当中Integer.MAX_VALUE-1=2147483646这样的值经过toFloat、toInt两次转换后就得到了2147483647——译注)
整个类层次结构的最底层有两个类型:scala.Null和scala.Nothing。Null是所有引用类型的子类,它只有一个实例,就是对象null。由于Null不是值类型的子类,所以null也不属于任何值类型,例如:将null赋值给一个int型变量是不可能的。
Nothing则是所有其他类型的子类,这个类没有任何实例。即便如此,它仍然可以作为类型参数而体现其存在价值。例如:Scala的library定义了一个值Nil,它是List[Nothing]的实例,由于Scala中list是协变(covariant)的,从而对于所有类型T,Nil都是List[T]的实例。(协变的概念在后文有介绍,这里不进行说明了——译注)
等词(“==”操作符)被设计为与类型的表现无关。对于值类型,它表示自然意义(数值、布尔值)上的相等,对于引用类型,它实际上相当于java.lang.Object的equals方法的别名。该方法本身被定义为引用相等,但可以被子类重新实现,用于表示子类在自然意义上的相等概念。例如:装箱后的值类型可以重新实现==用于比较被装箱的数值。而在Java中,==对于引用类型永远表示引用相等,虽然这样实现起来很容易,但却带来了很严重的一致性问题:两个本来相等的值装箱后再用==比较,可能就不再相等了。
有些情况下需要使用引用相等而非自定义比较,例如Hash-consing(Hash构建),因为此时性能至关重要。对以这种情况,AnyRef类型定义了另一个方法,eq,与java的“==”相同,实现的是引用相等的比较,但不同的是它不能被子类重载。
- 描述: 图1
- 大小: 102.3 KB
分享到:
相关推荐
#### Scala概述 Scala是一种相对新兴的编程语言,旨在为Java虚拟机(JVM)以及后来的通用语言运行时(CLR)提供支持。它融合了函数式编程(Functional Programming, FP)与面向对象编程(Object-Oriented Programming, OOP...
- **面向对象**:Scala是纯粹的面向对象语言,每一个值都是对象,所有的操作都是方法调用。 - **函数式编程**:Scala同时也是一个成熟的函数式编程语言,支持高阶函数、模式匹配等功能。 - **类型推断**:Scala具有...
这三本书将帮助读者深入理解Scala的核心概念、语法特性以及在实际开发中的应用。 "Scala Tutorial"可能是为初学者设计的,它通常会涵盖基础语法,如变量声明、数据类型、控制流结构、类与对象的定义,以及函数式...
6. **并发与并行**:Scala提供了高级的并发模型,如Actor模型,使得编写高并发的应用变得更加简单和直观。 7. **模块化与可扩展性**:Scala的模块化设计允许开发者轻松地构建可扩展的应用程序,支持动态加载和扩展...
2. **面向对象编程**:探讨Scala如何支持面向对象编程,包括类、对象、继承、多态等概念。 3. **函数式编程**:介绍函数式编程的核心理念,如纯函数、高阶函数、递归等,并展示了如何在Scala中实现这些概念。 4. **...
#### 三、学习目标与内容概述 《Learning Concurrent Programming in Scala》第二版是一本详尽介绍了如何使用Scala构建复杂的、可扩展的并发应用程序的书籍。本书通过实际案例和理论讲解相结合的方式,帮助读者掌握...
1. **语言概述**:Scala由Martin Odersky在2003年创建,它的名字是“Scalable Language”的缩写,意在表达其设计目标是能够随着系统规模的扩大而平滑扩展。Scala运行在Java虚拟机(JVM)上,因此它可以无缝地利用...
4. **Actor模型**:Scala内置了Akka库,它是基于Actor模型的并发处理框架,允许程序员创建能够并发执行且互不干扰的独立实体。 5. **表达式和控制流**:Scala的控制流语句,如if-else、for-comprehensions和while...
本书深入浅出地讲解了Scala如何通过Actor模型来支持并发编程,并提供了一些实战案例。 5. **高级特性**:此外,书中还涉及Scala的一些高级特性,比如类型类、隐式转换等,这些都是Scala与其他编程语言相比的独特之处...
2. **强大的并发模型**:Scala提供了Actors模型来实现并发编程,这种模型可以有效地处理大规模并发任务,降低了编写并发代码的复杂度。 3. **静态类型检查**:Scala是一种静态类型的语言,这意味着编译器可以在编译...
- **Actor模型**:Scala提供了Actor模型来实现并发编程,这是一种基于消息传递的并发模型,非常适合构建高并发应用。 - **Future与Promise**:Scala的`scala.concurrent`包提供了Future和Promise机制,用于处理异步...
#### 一、Scala编程语言概述 Scala是一种现代的多范式编程语言,它结合了面向对象编程和函数式编程的特点。Scala的设计目标是解决Java等传统面向对象语言在扩展性和灵活性方面的局限性,同时保持与现有Java生态系统...
#### 一、Scala语言概述 Scala是一种多范式编程语言,结合了面向对象编程和函数式编程的特点,运行在Java平台(JVM)上。它既能够提供静态类型检查的安全性,又能实现动态语言的灵活性。Scala的设计目标是解决Java的...
1. **基础类型与类**:Scala提供了基本的类型,如Int、Double、String等,以及一些核心类,如Any、AnyVal和AnyRef。这些类型和类构成了Scala语言的基础。 2. **对象与类**:在Scala中,类和对象是主要的结构单元。...
Scala编程是一种强大的、多范式的编程语言,它融合了面向对象和函数式编程的概念,旨在提高程序员的生产力和代码的可读性。Scala运行在Java虚拟机(JVM)上,因此可以无缝集成Java库,并利用Java平台的广泛生态系统...
#### 一、Scala Actor并发编程概述 ##### 1.1 什么是Scala Actor 在Scala中,Actor是一种强大的并行编程模型,它基于事件驱动和消息传递机制。通过Actor,我们可以更加简洁和高效地编写多线程应用程序,尤其是在...