类与对象
类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。
在Scala中,我们必须初始化字段,方法默认是共有的,类并不声明为public
,一个Scala源文件中可以有多个类。类的最简单的形式和Java或C++相似,例如用Class
定义一个名为Counter
的类:
class Counter {
private var value = 0
def increment() { value += 1}
def current() = value
}
类能够构造对象,并按照通常的方式来调用方法,我们可以使用new
关键字来创建类的对象。调用无参数的方法时,我们也可以不写()
。
val myCounter = new Counter() // or new Counter
myCounter.increment() // or myCounter.increment
单例对象
在Scala中没有静态方法或静态字段,但是它也为我们提供了单例模式的实现方法,那就是使用关键字object
。Scala中使用单例模式时,除了定义的类之外,还要定义一个同名的object
对象,它和类的区别是,object
对象不能带参数。
伴生对象
当单例对象与某个类共享同一个名称时,它被称作是这个类的伴生对象companion object
。必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类companion class
。类和它的伴生对象可以互相访问其私有成员。
类的两种属性
类中的字段自动带有getter
方法和setter
方法,可以用那个定制的方法替换掉字段的定义,而不必修改实用类的客户端,达到“统一访问原则”。
创建类的对象
class Counter {
// 声明私有成员变量
private var value = 0
// 配置成员函数,该函数作用为将value成员变量的值增加1
def increment() { value += 1}
// 配置成员函数,该函数将会将成员变量value的值返回
def current() = value
}
val myCounter = new Counter()
// 生成一个Counter类对象myCounter,并调用其成员函数increment(),myCounter对象刚创建时,其value变量的值为0,由于调用了increment()函数,value的值变为1
myCounter.increment()
// 调用myCounter对象中的current()函数,将该函数的返回值输出,结果为myCounter对象中value的值
println(myCounter.current)
创建单例对象
// 生成一个object类,也叫单例对象
object Accounts {
// 声明私有成员变量lastNumber
private var lastNumber = 0
// 定义成员函数,其作用为将lastNumber成员变量值增加1,并输出
def newUniqueNumber() = { lastNumber += 1; println(lastNumber)}
}
// 调用单例对象的newUniqueNumber()成员变量方法
Accounts.newUniqueNumber()
创建伴生对象
// 声明类
class test_companionObj {
// 声明成员变量,其变量的值为该类的伴生对象中的成员函数newUniqueNumber的返回值
val id = test_companionObj.newUniqueNumber()
// 声明成员变量balance,并将值初始化为0.0
private var balance = 0.0
// 声明成员函数,该函数含有Double类型的参数balance,此函数作用为将balace的值增加amount,即为让balance的值编程balance与amount的和
def deposit(amount: Double) { balance += amount }
}
// 创建伴生对象test_companionObj
object test_companionObj {
// 声明成员变量lastNumber,初始值设置为0
private var lastNumber = 0
// 声明私有成员函数newUniqueNumber,其作用为将lastNumber成员变量的值增加1,并返回
private def newUniqueNumber() = { lastNumber += 1; lastNumber }
// 定义主函数
def main(args: Array[String]) {
// 输出test_companionObj类的对象(非单例对象)的成员变量id的值
println(new test_companionObj().id)
}
}