1.伴生对象:
object定义的类不能实例化,其中的属性和方法都是静态的。
在Scala中,未提供static修饰符,都是将静态元素(属性或方法)定义到object类中。定义一个与其名字相同的object类,这个object类就是伴生对象。
class Test { } object Test { def execute = { println("executing") } } object Main { def main(args: Array[String]): Unit = { Test.execute } }
如果将伴生对象中的元素定义为private,在主类中可以访问,但是在其他类中无法访问。
2.apply方法:
最常见到的apply方法就是数组的定义:
val arr = Array(1, 2, 3)
定义数组没有用到new,而是直接调用了apply方法。下面是实现的源码:
object Array extends FallbackArrayBuilding { ... def apply(x: Int, xs: Int*): Array[Int] = { val array = new Array[Int](xs.length + 1) array(0) = x var i = 1 for (x <- xs.iterator) { array(i) = x; i += 1 } array } ... }
apply方法一般都是在伴生对象中定义的(lz认为apply就是Java中的静态工厂方法,所以定义在object中)。
apply方法调用方式:
class Test { def apply() = { // 这里apply定义要加(),否则不执行 println("this is class apply") } } object Test { def apply() = { // 这里apply定义要加(),否则不执行 println("this is object apply") new Test } } object Main { def main(args: Array[String]): Unit = { val test = Test() test() } }
输出结果为:
1 2 |
this is object apply this is class apply |
在类中定义的apply方法,new个该类的实例加()调用;在伴生对象中定义的apply方法,用该伴生对象名加()之间调用。
好文章!666,学习了