Apply方法:
- Scala自动调用Array类的伴生对象Array中的一个称为apply的方法,来创建一个Array对象myStrArr。
- apply方法调用约定:用括号传递给类实例或单例对象名一个或多个参数时,Scala 会在相应的类或对象中查找方法名为apply且参数列表与传入的参数一致的方法,并用传入的参数来调用该apply方法。
下面为代码示例
class TestApplyclass { def apply(param: String): String ={ println("apply method called,parameter is:" +param)
"Hello wor1d !" } } val myobject = new TestApplyclass println(myobject( "param1"))
在单例对象中定义apply方法:
object TestApplysingleobject { def apply(param1:String,param2: String): String = { println( "apply method called") param1 +" and " + param2 } } val group =TestApplysingleobject("Zhangfei", "Liubei") println(group)
可以看出,在执行TestApplySingleObject("Zhangfei" , "Liubei")时调用了apply方法,并且把“Zhangfei and Liubei”作为返回值,赋值给group变量,因此,println(group)语句会打印出“Zhangfei and Liubei"
伴生类和伴生对象中的apply:
class TestApplyClassAndObject {} class ApplyTest{ def apply() = println("apply method in class is called! ") def greetingofclass: Unit ={ println("Greeting method in class is called.") } } object ApplyTest{ def apply()={ println("apply method in object is called") new ApplyTest() } } object TestApplyClassAndObject{ def main (args: Array [String]){ val a= ApplyTest()//这里会调用伴生对象中的apply方法 a.greetingofclass a()//这里会词用伴生类中的apply方法 } }
从上面代码可以看出,当我们执行val a = ApplyTest(0时,会导致apply方法的调用并返回该方法调用的值,也就是ApplyTest的实例化对象。当执行a()时,又会导致调用伴生类的apply方法,如果我们愿意,就可以在伴生类的apply方法中写入一些处理逻辑,这样就可以把传入的参数赋值给实例化对象的变量
update方法:
当对带有括号并包括一到若干参数的对象进行赋值时,编译器将调用对象的update方法,在调用时,是把括号里的参数和等号右边的对象一起作为update方法的输入参数来执行调用
从上面可以看出,在进行元组赋值的时候,之所以没有采用Java中的方括号myStrArr[O]而是采用圆括号的形式,myStrArr(O),是因为存在上述的update方法的机制