apply使得创建实例时无需new.采用该机制,创建对象就等同于调用apply方法~

object Person {def apply(name: String, age: Integer, favColor: String): Person = new Person(name, age, favColor)
}class Person(name: String, age: Integer, favColor: String) {def run(): Unit ={println(s"$name is running")
}
}
object Test extends App{//不需要new关键字,传给Person的参数等价于传给了aplly方法val p=Person("xiaohong",23,"red")p.run()//xiaohong is running
}

为了理解,我们加上new关键字,此时调用的是Person的构造方法,而不是apply方法

object Person {def apply(name: String, age: Integer, favColor: String): Person = new Person(name, age, favColor)
}class Person(name: String, age: Integer, favColor: String) {def run(): Unit ={println(s"$name is running")
}
}
object Test extends App{//此时调用的是Person的构造方法,而不是apply方法val p=new Person("xiaohong",23,"red")p.run()//xiaohong is running
}

apply方法也可以显示调用,一般不这么做,这里是为了演示原理

object Person {def apply(name: String, age: Integer, favColor: String): Person = new Person(name, age, favColor)
}class Person(name: String, age: Integer, favColor: String) {def run(): Unit ={println(s"$name is running")
}
}
object Test extends App{//显式调用applyval p=Person.apply("xiaohong",23,"red")p.run()//xiaohong is running
}

删掉apply方法,不用new创建对象会报错

让我们把class加上case关键字,此时不报错了. 说明系统自动创建了一个参的apply方法!!这是关键. 就是说如果是case class,系统会自动在其伴生对象中创建apply方法!

object Person {}case class Person(name: String, age: Integer, favColor: String) {def run(): Unit ={println(s"$name is running")
}
}
object Test extends App{val p=Person("xiaohong",23,"red")p.run()//xiaohong is running
}

apply在源码中的应用

比如创建Array

object ArrayDemo extends App{val a=Array(1,2,5)
}

参数实际上传给了object Array的apply方法!

def apply(x: Int, xs: Int*): Array[Int] = {val array = new Array[Int](xs.length + 1)array(0) = xvar i = 1for (x <- xs.iterator) { array(i) = x; i += 1 }array}

创建List同理,实际调用的是apply方法

object ArrayDemo extends App{val a=scala.collection.immutable.List(1,2,5)
}
override def apply[A](xs: A*): List[A] = xs.toList

scala apply是什么相关推荐

  1. scala apply用法

    Scala比Java更面向对象的一个方面是Scala没有静态成员.替代品是,Scala有单例对象:singleton object. 当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:c ...

  2. scala apply方法 笔记

    原文出处:http://blog.csdn.net/pzw_0612/article/details/48576569 ---------------------------------------- ...

  3. Scala apply()方法用于创建伴生类对象

  4. java可变长字符串_具有可变长度的scala字符串插值

    scala> def format(n: Int)(i: Int) = | f"A%%0${n}d" format i format: (n: Int)(i: Int)Str ...

  5. scala面试问题_Scala面试问题

    scala面试问题 Before reading this post, please go through my previous post at "Scala Basic Intervie ...

  6. scala面试问题_Scala高级面试问答

    scala面试问题 Before reading this post, please go through my previous two posts at "Scala Basic&quo ...

  7. Scala知识点总结(上半部分)

    深度解析Scala -----------语法精细篇 1.安装Scala: 1.将安装包解压 2.配置环境变量 E:\program\scala-2.11.8 系统变量中配置:变量名:SCAL_HOM ...

  8. scala中的伴生类 伴生对象说明

    1.代码如下: [java]  view plain copy print ? package com.yy.oop /** * 伴生类和伴生对象 * class Student是伴生对象Object ...

  9. gradle发布jar_使用Gradle将JAR工件发布到Artifactory

    gradle发布jar 因此,我浪费了一两天(只是投资)来了解如何使用Gradle将JAR发布到本地运行的Artifactory服务器. 我使用Gradle Artifactory插件进行发布. 我迷 ...

最新文章

  1. 双人五子棋对战(需要EasyX图像库)
  2. ceph-deploy出错UnableToResolveError Unable to resolve host
  3. javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!
  4. python scipy库函数solve用法_如何在中使用事件scipy.integrate.solve_ivp
  5. 5月份,我居然发了这么多文章?我果然无聊.
  6. 常见web攻击方式与防御方法
  7. ef mysql 优化_C# EF优化
  8. QT Embedded二三事之QObject的元对象
  9. 1085 Perfect Sequence(25 分)
  10. 遥感原理与应用_遥感原理与应用考试题库及答案
  11. H+ HPlus创建新的标签页/选项卡
  12. java就业班学什么呀_传智播客JAVA就业班的学习心得
  13. 三、FreeNas实现SMB共享、FTP搭建实验报告
  14. pc即时聊天所用表情插件的记录
  15. python就业班-淘宝-目录.txt
  16. 请问做亚马逊,注册P卡是用个人名义还是公司名义?
  17. 自习室的泡利不相容定律(C语言实现)
  18. Linux--DNS域名解析服务
  19. 转:陈永康谈物联网测试
  20. c语言案例分析105,C语言实战105例源码

热门文章

  1. html变量改变结构,如何在html结构标签中使用js 变量 生成可变化的 title标题?
  2. java 范型 隐式 显式_隐式与显式接口实现
  3. python end用法_8种高级的Python列表使用技巧,都给你整理好啦(附实操代码)
  4. hook监控限制_**CodeIgniter通过hook的方式实现简单的权限控制
  5. Visual Studio 2019报错:缺少mfc120.dll
  6. cesium 飞行定位
  7. 小苹果 html,定时轮播.html
  8. 合成未来宝宝照片_父母照片重叠是宝宝长相?关晓彤鹿晗颜值逆天,邓超孙俪……...
  9. cesium 页面截图_Cesium开发入门篇 | 02Cesium开发环境搭建及第一个示例
  10. css窗口最大化,你如何使用css变换与jquery和地址窗口最大化不一致?