概念
Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概
念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象
来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴
生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。
单例对象
基本语法
object Person{
val country:String="China"
}
说明
(1)单例对象采用 object 关键字声明
(2)单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
(3)单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。
apply方法
说明
(1)通过伴生对象的 apply 方法,实现不使用 new 方法创建对象。
(2)如果想让主构造器变成私有的,可以在()之前加上 private。
(3)apply 方法可以重载。
(4)Scala 中 obj(arg)的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg)。用
以统一面向对象编程和函数式编程的风格。
(5)当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构
建对象时,调用的其实时伴生对象的 apply 方法。
案例实操
package chapter06
object Test11_Object {
def main(args: Array[String]): Unit = {
// val student11 = new Student11("alice",18)
// student11.printInfo()
val student1 = Student11.newStudent("alice",18)
student1.printInfo()
val student2 = Student11.apply("bob",18)
student2.printInfo()
//名称为aplly时候,可省略
val student3 = Student11("bob2",18)
student3.printInfo()
}
}
//定义类
class Student11 private(val name: String, val age: Int){
def printInfo(): Unit ={
println(s"student: name=$name, age=$age, school=${Student11.school}")
}
}
//伴生对象
object Student11{
val school: String = "atguigu"
//定义一个类的对象实例的创建方法
def newStudent(name: String, age: Int): Student11 = new Student11(name, age)
def apply(name: String, age: Int): Student11 = new Student11(name, age)
}
扩展:在 Scala 中实现单例模式的案例
package chapter06
object Test12_Singleton {
def main(args: Array[String]): Unit = {
val student1 = Student12.getInstance()
student1.printInfo()
println(student1)
val student2 = Student12.getInstance()
student2.printInfo()
println(student2)
}
}
//定义类
class Student12 private(val name: String, val age: Int){
def printInfo(): Unit ={
println(s"student: name=$name, age=$age, school=${Student11.school}")
}
}
//饿汉式的单例设计模式
//伴生对象
//object Student12{
//
// private val student: Student12 = new Student12("alice",18)
//
// def getInstance(): Student12 = student
//
//}
//懒汉式
object Student12{
private var student: Student12 = _
def getInstance(): Student12 = {
if (student == null){
//如果没有对象实例的话就创建一个
student = new Student12("bob",18)
}
student
}
}