1.apply的场景
Scala中实例化一个类,可以不用new , 其原因 其实就是 apply 方法,具体原因 后边再讲:
在上句中Scala 生成Array对象, 会自动去调用 Array 这个伴生对象的 伴生类中的apply方法,
Scala中apply方法 最大的特点就是 当一个实例化的类对象后边跟小括号(),并在小括号中传递了参数, 那么Scala会自动去该 类中找apply方法执行,ps:这个apply方法的参数要与 实例化对象后边小括号内的参数一致
eg:
class ApplyTest {
def apply(name:String): Unit ={
printf("called apply method , and name is %s",name)
}
}
val test = new ApplyTest
test("张三") //会自动调用 apply方法
输出:
2.然后看下apply方法的调用约定:
即 如果我们让一个类的实例化对象 或者一个单例对象,后边直接跟一个小括号并在括号中传递参数, eg: 类实例(参数) 或 单例对象(参数) ,
这种写法出现时,Scala会自动在该对象中 查找apply 方法,而且这个apply方法的参数和 调用时候写的 参数一致 (即:参数个数和类型一致)
eg:
class ApplyTest {
def apply(name:String): Unit ={
printf("called apply method , and name is %s",name)
}
}
val test = new ApplyTest
test.apply("张三")
输出:
3.apply 可以用来干嘛
最主要的是 结合伴生对象,利用伴生对象 是object单例静态对象 不用实例化,来构建工厂模式,创建实例化对象。即实现: " val 实例对象 = 类名(参数) " 这种函数式编程的风格实现 实例化对象,
可以不用Java面向对象式的 " 类名 实例名 = new 类名() ", 这就体现了Scala的 面向对象和 函数编程 的融合
伴生对象,其实就是一个与实体类名称相同的 object 单例对象
伴生对象 详细说明:https://blog.youkuaiyun.com/hzp666/article/details/115863497
4.Scala中使用apply方法 实现函数式编程方式 实例化对象
eg1:
class ApplyTest(name:String){
def speak(){
val name = this.name
println(name+"is speaking")
}
}
object ApplyTest{
def apply(name:String): ApplyTest ={
new ApplyTest(name)
}
}
val p1 = ApplyTest("张三")
p1.speak()
输出:
eg2:
5.Scala融合了面向对象 和 函数式编程
eg:
def add = (x:Int, y:Int) => x+y
println("这里没有调用apply", add(1,2))
println("这里调用 apply:",add.apply(2,3))
输出:
不需要去写apply方法, 系统会自动支持apply写法
ps: 但是 在实例化类 中 有两种方法,1. 要么在伴生对象中 定义好apply方法 2. 在class 前加 case ,这样系统会自动生成 apply方法
eg1: 还是自定义 apply
eg2: 使用case 让系统自动生成apply
case class Dog(val name:String){
def bark(): Unit ={
println("dog is wangwang")
}
}
val daHuang = Dog("daHuang")
daHuang.bark()
输出: