Scala 语言是 完全面向对象 的语言,所以并没有静态的操作(即在 Scala 中没有静态的概念)但是为了能够和 Java 语言交互(因为 Java 中有静态概念),就产生了一种特殊的对象来 模拟类对象 ,该对象为 单例对象 。若单例对象名与类名一致,则称该单例对象这个类的 伴生对象 ,这个类的所有“静态”内容都可以 放置在它的伴生对象 中声明。
一、语法分析
//(1)伴生对象
object Person {
var country: String = "China"
}
//(2)伴生对象
class Person {
var name: String = "bobo"
}
object Test {
def main(args: Array[String]): Unit = {
//(3)伴生对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。
println(Person.country)
}
}
二、Apply方法
( 1 )通过 伴生对象 的 apply 方法, 实现不使用 new 方法创建对象。( 2 ) apply 方法可以重载。( 3 ) Scala 中 obj(arg) 的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg) 。用以统一面向对象编程和函数式编程的风格。( 4 )当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时,调用的其实时伴生对象的 apply 方法。
object Test {
def main(args: Array[String]): Unit = {
//(1)通过伴生对象的 apply 方法,实现不使用 new 关键字创建对象。
val p1 = Person()
println("p1.name=" + p1.name)
val p2 = Person("bobo")
println("p2.name=" + p2.name)
}
}
// 伴生类 (如果想让主构造器变成私有的,可以在()之前加上 private)
class Person private(cName: String) {
var name: String = cName
}
// 伴生对象
object Person {
def apply(): Person = {
println("apply 空参被调用")
new Person("xx")
}
def apply(name: String): Person = {
println("apply 有参被调用")
new Person(name)
}
}