Scala学习1:伴生对象和apply方法

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()
  }
}

输出结果为:

在类中定义的apply方法,new个该类的实例加()调用;在伴生对象中定义的apply方法,用该伴生对象名加()之间调用。

1 Reply to “Scala学习1:伴生对象和apply方法”

发表评论