- 定义了函数式对象的类或者是没有任何可变状态的对象。
不可变对象有很多好处:1、不可变对象更容易进行推理;2、不可变底下那个可以进行自由的传递而不必在传递给其他代码之前对它们做保护式的拷贝;3、不可变对象可以被安全的应用在哈希表中作为键来使用。
也有一些坏处,主要实在需要拷贝一个大的对象图,实际上更改的只是很少的一部分,容易带来性能瓶颈。
类的定义
class Rational(n: Int, d: Int)
-
n和d是类参数,这里的n和d并不是普通意义上类的字段。Scala编译器会创建一个主构造方法用来接收这两个参数,只出现在构造方法中,编译器不会构造类的字段。对于n和d有例子:
-
class Rational(n: Int, d: Int) { // This won't compile require(d != 0) override def toString = n + "/" + d def add(that: Rational): Rational = new Rational(this.n * that.d + that.n * d, d * that.d) }
编译器只为调用add的Rational对象提供n和d的值,对that是不提供的,因为that没有调用add函数,因此这段代码是不能通过编译的。可以在类中添加val number: Int = n来定义类的字段
- 在类定义体中给出的非字段或者方法定义的代码编译进类的主构造方法当中。
- 前置条件可以用来验证入参的合法性。使用
require(requirement: Boolean)方法
- 前置条件可以用来验证入参的合法性。使用
辅助构造方法
- 需要在类中定义多个构造方法,主构造方法之外的构造方法称为辅助构造方法。以
def this(……)开始。
- 需要在类中定义多个构造方法,主构造方法之外的构造方法称为辅助构造方法。以
- 在
Scala中,每个辅助构造方法都必须首先调用别的辅助构造方法或者是主构造方法,这样主构造方法就是类的唯一入口。
- 在
Scala中的标识符
- 字母数字组合,以字母或者下划线打头,
$也可以,一般预留给编译器生成的标识符;常量标识符一般都首字母大写
- 字母数字组合,以字母或者下划线打头,
- 操作标识符是指可以被打印出来的
ASCII字符,编译器会在内部使用内嵌$的方式将操作标识符转换为合法的Java标识符,:-> $colon$minus$greater.
- 操作标识符是指可以被打印出来的
- 混合标识符:由字母数字标识符,下划线以及一个符号操作符组成,例如
unary_-
- 混合标识符:由字母数字标识符,下划线以及一个符号操作符组成,例如
- 字面标识符:使用``包括起来的标识符。可以将任何在运行时刻可以被接受的字符串放在其中。比如
Thread.yield在程序中是不能生效的,因为yield是保留字,可以使用
- 字面标识符:使用``包括起来的标识符。可以将任何在运行时刻可以被接受的字符串放在其中。比如
Thread.`yield`()
方法重载
- 方法重载是指方法名被用于多个方法,方法的入参是不同的。被编译器选中的是最匹配入参静态类型的重载版本。