在Scala中,类和对象可以共享同一个名称。
当一个对象与一个类共享一个名称时,它被称为伴生对象,并且该类被称为伴生类。
伴生对象是与另一个类或特征共享相同名称和源文件的对象。(需要在一个文件下)
一个trait可以看作是一个Java接口。
这种方法允许我们在类上创建静态成员。
伴生对象对实现辅助方法和工厂很有用。
要实现一个创建不同类型的形状的工厂,我们可以在Scala中创建一个形状工厂。
类和它的伴生对象可以互相访问其私有成员。
例子
我们使用一个伴生类Shape和一个伴生对象Shape,作为一个工厂。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| trait Shape { def area :Double } object Shape { private class Circle(radius: Double) extends Shape{ override val area = 3.14*radius*radius } private class Rectangle (height: Double, length: Double)extends Shape{ override val area = height * length } def apply(height :Double , length :Double ) : Shape = new Rectangle(height,length) def apply(radius :Double) : Shape = new Circle(radius)
}
object Main extends App { val circle = Shape(2) println(circle.area) val rectangle = Shape(2,3) println(rectangle.area) }
|
更直观的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| object Companion { def main(args: Array[String]): Unit = { val person = new Person println(Person.param)
println(person.sum(11, 22))
Person.printAge
val p1: Person = Person.apply() val p2: Person = Person() } }
class Person { val name = "Jacky" private val age = 20
def sum(x: Int, y: Int) = Person.add(x, y) }
object Person { val param = "100"
private def add(x: Int, y: Int) = x + y
def printAge = println(s"age=${new Person().age}")
def apply(): Person = new Person() }
|
注意
与伴生类不共享相同名称的单例对象称为独立对象。
转载自:
https://www.w3cschool.cn/scala/scala-companion-objects.html
https://www.jianshu.com/p/26bd596090f6