前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Scala 【 7 object 】

Scala 【 7 object 】

作者头像
Lokinli
发布2023-03-09 14:42:07
发布2023-03-09 14:42:07
25100
代码可运行
举报
文章被收录于专栏:以终为始以终为始
运行总次数:0
代码可运行
object

object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method 。

第一次调用 object 的方法时,就会执行 object 的 constructor ,也就是 object 内容的不在 method 中的代码,但是 object 定义接受参数的 constructor 。

object 的 constructor 只会在起第一次被调用时执行一次,以后再次调用就不会再次执行 constructor 。

object 通常用于作为单例模式的实现或者放在 class 的静态成员。

代码语言:javascript
代码运行次数:0
运行
复制
object Person{
	private var eyeN = 2
    println("this is Object.")
	def getEyeN = eyeN
}
伴生对象

如果有一个 class 和一个与其同名的 object ,那么称这个 object 是 class 的伴生对象,class 是 object 的伴生类。

伴生类和伴生对象必须存放在一个 .scala 文件之中。

伴生类和伴生对象最大的特点在于可以互相访问 private field 。

代码语言:javascript
代码运行次数:0
运行
复制
object Person{
    private val eyeNum = 2
    def getEyeNum = eyeNum
}
class Person(val name:String, val age:Int){
    def sayHello = println("Hi," + name + " you are " + age + "years old." + "You have " + Person.eyeNum + "eyes.")
}
object 继承抽象类

object 的功能是其和 class 类似,除了不能定义接受参数的 constructor 之外,object 也可以继承抽象类,并覆盖抽象类中的方法。

代码语言:javascript
代码运行次数:0
运行
复制
abstract class Hello(var message:String){
    def sayHello(name:String):Unit
}

object HelloImpl extends Hello("hello"){
    override def sayHello(name:String) = {
        println(message + " ," + name)
    }
}
apply 方法

apply 方法是 object 中非常重要的一个特殊方法。

通常在伴生对象中实现 apply 方法,并在其中实现构造伴生类的对象的功能。

创建伴生类的对象时,通常不会使用 new Class 的方式,而是使用 Class() 的方式,隐式地调用伴生对象的 apply 方法。

比如,Array 类的伴生对象 apply 方法就实现了接受可变数量的参数,并创建一个 Array 对象的功能。

代码语言:javascript
代码运行次数:0
运行
复制
val a = Array(1,2,3,4)
main 方法

在 scala 中,如果运行一个应用程序,需要一个 main 方法作为入口。

scala 中的 main 方法定义为 def main(args:Array[String]) ,而且必须定义在 object 中。

代码语言:javascript
代码运行次数:0
运行
复制
object HelloWord{
	def main(args:Array[String]){
		println("Hello!")
	}
}

除 了自己实现 main 方法之外,还可以继承 App Trait,然后将需要在 main 方法中运行的代码,直接作为 object 的constructor 代码,而且用 agrs 可以接受传入的参数。

App Trait 工作原理:App Trait 继承自 DelayedInit Trait, scalac 命令进行编译时,会把继承 App Trait 的 object 的 constructor 代码都放到 DelayedInit Trait 的 delayedInit 方法中执行。

用 object 来实现枚举功能

代码语言:javascript
代码运行次数:0
运行
复制
object Season extends Enumeration {
    val SPRING,SUMMER,AUTUMN,WINTER = Value
}

// 还可以通过 value 传入枚举值的 id 和 name ,通过 id 和 toString 来获取。
// 可以通过 id 和 name 来查询枚举值
object Season extends Enumeration {
    val SPRING = Value(0,"spring")
    val SUMMER = Value(1,"summer")
    val AUTUMN = Value(2,"autumn")
    val WINTER = Value(3,"winter")
}
// 访问
Season(0)
Season.withName("spring")

// 使用增强 for 循环来遍历
for (ele <- Season.values) println(ele)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • object
  • 伴生对象
  • object 继承抽象类
  • apply 方法
  • main 方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档