apply方法是scala中独有的,当对象以函数的方式进行调用时,scala会隐式地将调用改为在该对象上调用apply方法
在java中需要用到new来创建新的对象,例如:
ArrayList<String> str = new ArrayList<>();
在Scala中不需要用new就可以直接创建新的对象
val arr =Array("jack","lucy")
这里涉及到apply方法。当采用这种方式声明一个数组的时候,Scala会自动调用Array这个类的伴生对象Array中的apply方法,
apply方法调用:用括号传递给类实例或单例对象名一个或多个参数时,Scala会在相应的类或对象中查找方法名为apply且参数列表与传入的参数一致的方法,并用传入的参数来调用该apply方法。从而创建一个数组对象。
首先定义一个类
class hello{
def apply (name : String): Unit = {
println("hello\t"+name)
}
}
在测试类中
val h = new hello //如果出现实例名称(有参或无参),就自动调用类中定义的apply方法
h("world") //结果:hello world
h.apply("world") //结果:hello world
在Scala中,我们把所有类的构造方法以apply方法的形式定义在它的伴生对象当中,这样伴生对象的方法就会自动被调用,调用就会生成类对象。
class MyName (name:String) {
def info (): Unit = {
println("my name is :"+name) //调用伴生类Car的构造方法
}
}
object MyName { //定义了MyName的伴生对象,这样,我们可以通过调用MyName("str")来创建一个Car实例,而不是使用new关键字。
def apply(name:String) = new MyName("jack")
}
object NameTest {
def main(args:Array[String]){
val myName = MyName("jack") //调用伴生对象中的apply方法
myName.info() //输出结果为"my name is :jack"
}
}
Scala之所以用apply方法是为了保持它的对象和函数之间使用的一致性,因为Scala融合了面向对象和函数式两种编程风格,它是一种混合式的编程。
- 面向对象调用:对象.方法
- 函数式调用:函数(参数)
scala> def add = (x:Int,y:Int)=>x+y //定义函数add
add: (Int, Int) => Int
scala> add(5,5) //采用函数式调用
res0: Int = 10
scala> add.apply(5,5) add也是对象,也可以采用点号形式调用
res1: Int = 10
Scala中函数式的调用可以转化成对象调用,同理对象调用也可以被转化成函数的调用。