Scala中apply方法的应用

前言

scala作为面向对象语言,有很多独特的黑科技,下面介绍一个黑科技用法!将对象当做函数来进行调用!下面通过一些案例来进一步阐述这个用法!

code

package com.zhengkw.single

/**
 * Author zhengkw
 * Date 2020/4/25 10:37
 */
object ApplyDemo1 {
    def main(args: Array[String]): Unit = {
        A()   // 等价于 A.apply()
        A.apply()
        val a = new A
        a()
        
        
        (foo _).apply(10)
        
        
    }
    
    
    def foo(a:Int) = println("foo...")
}


object A{
    def apply() = println("A... apply")
}
class A{
    
    def apply() = println("class A ... apply")
    
}
A... apply
A... apply
class A ... apply
foo...

特别注意

注意通过伴生对象调用apply方法或者伴生对象()都会调用伴生对象中的apply方法!
而通过new出来的 对象调用apply方法会执行伴生类中的apply方法!
而没有声明过apply方法的对象调用的scala提供的apply方法!

在这里插入图片描述
因为我(foo _)转为函数后只是传入了一个参数,所以调用的fun1里的apply方法。如果参数为N则调用funN的apply方法!

一般用法

一般apply是用于实例化对象使用!即在工厂类使用!以下介绍一些关于apply的注意事项

  1. 其实函数也可以通过apply进行调用. (方法不行), 如果是方法, 先把方法转成函数(使用下划线!)再使用.
  2. 伴生对象apply, 通常情况是返回伴生类的对象, 然后在外面创建对象的时候, 可以省略new
  3. 普通类中的apply, 一般根据具体的业务逻辑来实现.
  4. apply 也可以重载
package com.atguigu.scala1128.day05.single

/**
 * Author atguigu
 * Date 2020/4/25 11:17
 */
object ApplyDemo2 {
    def main(args: Array[String]): Unit = {
        val user = User("lisi", 20); // User.apply("lisi", 20)
        println(user)
        val arr = new MyArray(10,20,30,40)
        println(arr(0))  // arr.apply(0)
        println(arr(1))
        
    }
}

class MyArray(val args: Int*){
    def apply(index: Int) = args(index)
    
}

object User {
    var a = 10
    def apply(name: String, age: Int) = new User(name, age)
}

class User(val name: String, var age: Int){
    var a = 100
    override def toString: String = s"$name, $age, ${User.a}" //打印的是伴生对象里的a
}

lisi, 20, 10
10
20

总结

  • 方法名必须是apply!!!
  • 伴生对象调用的apply方法是在伴生对象中声明的!
  • new出来的对象调用的是类中的apply方法!
  • apply方法也支持重载!

可参考博文

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值