object

object相当于class的单个实例,类似于Java中的static,通常在里面放一些静态的field和method。 
  
第一次调用object中的方法时,会执行object的constructor,也就是object内部不在method或者代码块中的所有代码,但是object不能定义接受参数的constructor 

注意:object的构造函数只会在第一次被调用时被执行一次,这点类似Java类中static的初始化。


object Person {
private var eyeNum = 2
println("this Person object")
def getEyeNum = eyeNum
}
defined module Person
// 第一次调用会初始化
scala> Person.getEyeNum
this Person object
res14: Int = 2
// 第二次都没有再执行初始化
scala> Person.getEyeNum
res15: Int = 2

伴生对象、伴生类

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

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

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


object Person{
private val eyeNum = 2
def getEyeNum = eyeNum
}
class Person(val name: String, val age: Int){
def sayHello = println("Hi," + name + ", I guess you must have " + Person.eyeNum + " eyes.") // 访问同名object私有字段
}
defined module Person
defined class Person
scala> val s = new Person("sparks", 30)
s: Person = Person@3b30eec5
scala> s.sayHello
Hi,sparks, I guess you must have 2 eyes.

apply方法(重要)

object中非常重要的一个特殊方法。 
通常在伴生对象中实现apply方法,并在其中实现构造伴生类对象的功能;这样在创建伴生类对象时,可以使用Class()方式(而不仅仅是new Class方式),原理是隐式地调用了伴生对象的apply方法,让对象创建更加简洁。


class Person(val name: String)
object Person{
def apply(name: String) = new Person(name)
}
defined class Person
defined module Person
// 可以直接使用Class()方式创建对象。
scala> val test = Person("sparks")
test: Person = Person@7cdfa824

main方法

在scala中,如果要运行一个应用程序,那么必须有一个main方法,作为入口

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


object HelloWorld {
def main(args: Array[String]){
println("Hello, Wrold")
}
}

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


object HelloWorld extends App {
if (args.length > 0) println("hello, " + args(0))
else println("HelloWorld")
}

如果要运行上述代码,需要将其放入.scala文件,然后使用scalac编译,再用scala执行。


// 编译
scalac HelloWorld.scala
// 运行(输出运行所花费的时间)
scala -Dscala.time HelloWorld

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

用object来实现枚举功能

Scala没有直接提供类似于Java中的Enum枚举特性,如果要实现枚举,则需要用object继承Enumeration类,并且调用Value方法来初始化枚举值。


object Season extends Enumeration {
val SPRINT, SUMMER, AUTUMN, WINTER = Value
}
defined module Season
scala> Season.SPRINT
res17: Season.Value = SPRINT
// 还可以通过Value传入枚举值的id和name,通过id和toString来获取
object Season extends Enumeration {
val SPRINT = Value(0, "spring")
val SUMMER = Value(1, "summer")
val AUTUMN = Value(2, "autumn")
val WINTER = Value(3, "winter")
}
defined module Season
scala> Season.SPRINT.id
res20: Int = 0
scala> Season.SPRINT.toString
res21: String = spring
scala> Season(0)
res22: Season.Value = spring
scala> Season(2)
res23: Season.Value = autumn
scala> Season.withName("winter")
res24: Season.Value = winter
// 使用枚举object.values 可以遍历枚举值
scala> for (ele <- Season.values ) println(ele)
spring
summer
autumn
winter

Scala入门系列(六):面向对象之object的更多相关文章

  1. Scala入门系列(九):函数式编程

    引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...

  2. Go语言入门系列(六)之再探函数

    Go语言入门系列前面的文章: Go语言入门系列(三)之数组和切片 Go语言入门系列(四)之map的使用 Go语言入门系列(五)之指针和结构体的使用 在Go语言入门系列(二)之基础语法总结这篇文章中已经 ...

  3. Scala入门系列(五):面向对象之类

    定义类 // 定义类,包含field以及method class HelloWorld { private var name = "Leo" def sayHello() { pr ...

  4. Scala入门系列(七):面向对象之继承

    extends 与Java一样,也是使用extends关键字,使用继承可以有效复用代码 class Person { private var name = "leo" def ge ...

  5. Scala入门系列(八):面向对象之trait

    基础知识 1 将trait作为接口使用 此时Trait就与Java中的接口非常类似,不过注意,在Scala中无论继承还是trait,统一都是extends关键字. Scala跟Java 8前一样不支持 ...

  6. Scala入门系列(一):基础语法

    Scala基础语法 Scala与JAVA的关系 Scala是基于Java虚拟机,也就是JVM的一门编程语言,所有Scala的代码都需要经过编译为字节码,然后交由Java虚拟机来运行. 所以Scala和 ...

  7. Scala入门系列(十一):模式匹配

    引言 模式匹配是Scala中非常有特色,非常强大的一种功能. 类似于Java中的switch case语法,但是模式匹配的功能要比它强大得多,switch只能对值进行匹配,但是Scala的模式匹配除了 ...

  8. Scala入门系列(十二):隐式转换

    引言 Scala提供的隐式转换和隐式参数功能,是非常有特色的功能.是Java等编程语言所没有的功能.它可以允许你手动指定,将某种类型的对象转换成其他类型的对象.通过这些功能可以实现非常强大而且特殊的功 ...

  9. Scala入门系列(十三):类型参数

    引言 Scala中类型参数是什么呢?其实就类似于Java中的泛型.定义一种类型参数,比如在集合.类.函数中定义类型参数,然后就可以保证使用到该类型参数的地方就只能是这种类型,从而实现程序更好的健壮性. ...

随机推荐

  1. WPF MessageContract DataContract

    个人理解: DataContract:都序列化在消息体内. MessageContract :能够定义数据字段的序列化位置,比如在头部或者在消息体内.

  2. restful framework之权限组件

    一.权限简介 只用超级用户才能访问指定的数据,普通用户不能访问,所以就要有权限组件对其限制 二.局部使用 from rest_framework.permissions import BasePerm ...

  3. 【Java源码解析】Thread

    简介 线程本质上也是进程.线程机制提供了在同一程序内共享内存地址空间运行的一组线程.对于内核来讲,它就是进程,只是该进程和其他一下进程共享某些资源,比如地址空间.在Java语言里,Thread类封装了 ...

  4. 关于恶意说说自动在QQ空间转发的机制

    有些很讨厌的带链接说说,只要你在手机打开它,就会自动转发,内容极其不雅 一怒之下我决定看个究竟首先,在此页开头有此关键语句: <iframe src="http://rtb.map.q ...

  5. Git积累

    1.使用git config命令进行配置(此配置为全局配置,这些是在提交commit时的签名): $ git config --global user.name "填写github的用户名& ...

  6. aws存储桶s3使用

    关于aws s3的使用说明: aws官方文档地址:https://docs.aws.amazon.com/s3/index.html#lang/zh_cn 创建s3与基础使用: 1.登陆aws控制台- ...

  7. OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor

    在python用cv2.imread()读取图片的时候一直报错,检查了图片的绝对路径是存在的. 报错的图片用skimage.io.imread()是可以读的. 查了一下,有可能是原图片文件有什么嵌入错 ...

  8. OpenGL 笔记<1> 固定管线实例 + 双缓存测试实例

    欲以此分类来记录opengl的学习历程,此为第一篇,所以先来一个固定管线的例子,以及对双缓存的测试. 一.配置环境 写之前,先进行配置,然后再讲内容. 注:第一部分涉及的代码均忽略. [环境配置传送门 ...

  9. CocoStuff—基于Deeplab训练数据的标定工具【三、标注工具的使用】

    一.说明 本文为系列博客第三篇,主要展示COCO-Stuff 10K标注工具的使用过程及效果. 本文叙述的步骤默认在完成系列文章[二]的一些下载数据集.生成超像素处理文件的步骤,如果过程中有提示缺少那 ...

  10. 高可用OpenStack(Queen版)集群-10.Nova计算节点

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...