Scala中的apply方法

 

1.apply的场景

Scala中实例化一个类,可以不用new , 其原因 其实就是 apply 方法,具体原因 后边再讲:

 

Scala中的apply方法_第1张图片

 

在上句中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方法的调用约定:

Scala中的apply方法_第2张图片

 

即 如果我们让一个类的实例化对象  或者一个单例对象,后边直接跟一个小括号并在括号中传递参数, 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的  面向对象和 函数编程 的融合

 

Scala中的apply方法_第3张图片

Scala中的apply方法_第4张图片

 

伴生对象,其实就是一个与实体类名称相同的 object 单例对象

伴生对象 详细说明:https://blog.csdn.net/hzp666/article/details/115863497

 

 

4.Scala中使用apply方法  实现函数式编程方式  实例化对象

 

Scala中的apply方法_第5张图片

 

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

 

输出:

Scala中的apply方法_第6张图片

 

eg2:

Scala中的apply方法_第7张图片

 

5.Scala融合了面向对象 和 函数式编程

eg:

def add = (x:Int, y:Int) => x+y

println("这里没有调用apply", add(1,2))
println("这里调用 apply:",add.apply(2,3))

输出:

Scala中的apply方法_第8张图片

 

不需要去写apply方法, 系统会自动支持apply写法

ps: 但是 在实例化类 中 有两种方法,1. 要么在伴生对象中 定义好apply方法  2. 在class 前加 case ,这样系统会自动生成 apply方法

eg1:  还是自定义 apply

Scala中的apply方法_第9张图片

 

eg2: 使用case  让系统自动生成apply

case class Dog(val name:String){
  def bark(): Unit ={
    println("dog is wangwang")
  }
}

val daHuang = Dog("daHuang")
daHuang.bark()

 

输出:

Scala中的apply方法_第10张图片

 

 

 

你可能感兴趣的:(Scala,scala,类,apply)