单例对象:
在Scala中,没有静态方法或静态字段,为了达到同样目的,Scala中使用单例对象,以object关键字定义,单例对象为程序的执行提供入口点
单例是一种只能有一个实例的对象
单例对象的成员、方法都默认是静态的,可以全局访问,共享全局变量很有意义
单例对象还可以扩展类和性状
与类不同的是,单例对象没有参数,单列对象可以拥有类的所有特性
需要注意的是,单例对象会在第一次被访问的时候初始化
伴生对象:
当一个单例对象与类具有相同的名称时,这个单例对象被称作是这个类的伴生对象,同样,这个类被称作是这个单例对象的伴生类
类和它的伴生对象可以互相访问私有特性,类和它的伴生对象必须定义在同一个源文件中
独立对象:
当一个单例对象没有与类具有相同的名称,这个单例对象被称作是独立对象。
独立对象一般作为Scala应用的入口点,或相关功能方法的工具类
apply方法:
通常,在一个类的伴生对象中定义apply方法,在生成这个类的对象时,就省去了new关键字
apply方法主要用来解决复杂对象的初始化问题
Scala的apply有两种方式,一种是伴生类的apply,另一种是伴生对象的apply
下面举几个简单的例子来说明:
单例对象:
/**
* 单例对象
*/
object Student {
private val name:String="tom"
def getName: Unit ={
println("My name is "+name)
}
}
object Init{
def main(args: Array[String]): Unit = {
// 直接调用Student的getName方法即可
Student.getName
}
}
结果:
My name is tom
伴生对象:
// 伴生类
class Student(var name: String,var address: String) {
// 学校
private val school = "no.1 middle school"
// 调用伴生对象的私有成员
def getID: Unit ={
println("获取伴生对象的私有成员"+Student.id)
}
}
// 伴生对象
object Student {
// 学号
private var id:Int=1
def main(args: Array[String]): Unit = {
// 实例化对象tom
val tom =new Student("tom","北京")
// 获取伴生类的私有成员school
println("获取伴生类的私有成员"+tom.school)
// 获取伴生对象的私有成员id
tom.getID
println("我叫"+tom.name+",住在"+tom.address+",在"+tom.school+"上学,"+"学号是"+id)
}
}
结果:
获取伴生类的私有成员no.1 middle school
获取伴生对象的私有成员1
我叫tom,住在北京,在no.1 middle school上学,学号是1
apply
// 伴生类
class Student(var name: String,var address: String) {
// 学校
private val school = "no.1 middle school"
// 调用伴生对象的私有成员
def getID: Unit ={
println("获取伴生对象的私有成员"+Student.id)
}
}
// 伴生对象
object Student {
// 学号
private var id:Int=1
// 定义apply方法,实例化伴生类
def apply(name: String, address: String): Student = new Student(name, address)
def main(args: Array[String]): Unit = {
// 通过伴生对象的apply方法创建实例
val jerry=Student("jerry","上海")
println("获取伴生类的私有成员"+jerry.school)
jerry.getID
println("我叫"+jerry.name+",住在"+jerry.address+",在"+jerry.school+"上学,"+"学号是"+id)
}
}
结果:
获取伴生类的私有成员no.1 middle school
获取伴生对象的私有成员1
我叫jerry,住在上海,在no.1 middle school上学,学号是1
伴生类与伴生对象的apply
class ApplyTest {
def apply() = println("这是伴生类的apply方法")
}
object ApplyTest {
def apply() = {
println("这是伴生对象的apply方法")
new ApplyTest
}
}
// 独立对象,作为程序入口
object ApplyInit{
def main(args: Array[String]): Unit = {
// 通过伴生对象的apply方法,进行实例化
val applyTest=ApplyTest()
// 这是伴生类的apply方法
applyTest()
}
}
结果:
这是伴生对象的apply方法
这是伴生类的apply方法
5+