object

  • 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method,第一次调用 object 的方法时,就会执行 object 的 constructor,也就是 object 内部不在 method 中的代码,需要注意的是,object 不能定义接受参数的 constructor
  • object 的 constructor 只会在其第一次被调用时执行一次,以后再调用就不会再次执行了
  • object 通常用于单例模式的实现,或者放 class 的静态成员,比如工具方法 object,通常在里面放一些静态的 field 或者 method
object People {
private var mouthNum = 1
println("this People object!")
def getMouthNum = mouthNum
}
People.getMouthNum

执行程序之后可以看到,构造方法只被调用了一次。

伴生对象

  • 如果一个程序中,如果有一个 class,还有一个与 class 同名的 object,那么就称这个 object 是 class 的伴生对象, class 是 object 的伴生类
  • 伴生类和伴生对象必须存放在一个 .scala 文件之中
  • 伴生类和伴生对象,最大的特点就在于,它们互相可以访问彼此的 private field
object People {
private val mouthNum = 1
def getMouthNum = mouthNum
} class People(val name: String, val age: Int) {
def sayHello = println("Hi, " + name + ", I guess you are " + age + " years old!" + ", and you have " + People.mouthNum + " mounth.")
} val people = new People("0mifang", 18) // Hi, 0mifang, I guess you are 18 years old!, and you have 1 mounth.
people.sayHello

继承抽象类

  • object 的功能其实和 class 类似,除了不能定义接受参数的 constructor 之外,object 也可以继承抽象类,并覆盖抽象类中的方法
abstract class Eat(var message: String) {
def eat(food: String): Unit
} object EatImpl extends Eat("0mifang") {
override def eat(food: String) = {
println(message + " eat an " + name)
}
} EatImpl.sayHello("ice cream")

apply方法

  • 通常在伴生对象中实现 apply 方法,并在其中实现构造伴生类的对象的功能,而创建伴生类的对象时,通常不会使用 new Class 的方式,而是使用 Class() 的方式,隐式地调用伴生对象得 apply 方法,这样会让对象创建更加简洁
class Person(val name: String)	//创建伴生类
object Person { //创建伴生对象
def apply(name: String) = new Person(name)
} val p1 = new Person("0mifang1")
val p2 = Person("0mifang2")

main方法

  • 需要使用命令行敲入 scalac 编译源文件然后再使用 scala 执行
  • Scala 中的 main 方法定义为 def main(args: Array[String]) ,而且必须定义在 object 中
object Test {
def main(args: Array[String]) {
println("I'm learning the Scala!!!")
}
}
  • 除了自己实现 main 方法之外,还可以继承 App Trait,然后将需要在 main 方法中运行的代码,直接作为 object 的 constructor 代码;而且用 args 可以接受传入的参数
  • App Trait 的工作原理为:App Trait 继承自 DelayedInit Trait,scalac 命令进行编译时,会把继承 App Trait 的 object 的 constructor 代码都放到 DelayedInit Trait 的 delayedInit 方法中执行
object Test extends App {
if (args.length > 0) println("hello, " + args(0))
else println("Hello World!!!")
}

用 object 来实现枚举功能

  • 需要用 object 继承 Enumeration 类,并且调用 Value 方法来初始化枚举值
object Color extends Enumeration {
val RED, BLUE, YELLOW, WHITE, BLACK = Value
}
Color.RED
  • 还可以通过 Value 传入枚举值的 id 和 name,通过 .id.toString 可以获取; 还可以通过 id 和 name 来查找枚举值
object Color extends Enumeration {
val RED = Value(0, "red")
val BLUE = Value(1, "blue")
val YELLOW = Value(2, "yellow")
val WHITE = Value(3, "white")
val BLACK = Value(4, "black")
}
Color(0)
Color.withName("red")
  • 使用枚举 object.values 可以遍历枚举值
for (ele <- Color.values) println(ele)



欢迎关注,本号将持续分享本人在编程路上的各种见闻。

Scala 学习(6)之「对象」的更多相关文章

  1. 【入门必看】不理解「对象」?很可能有致命bug:简单的Python例子告诉你

    简介:越来越多的人要在学习工作中用到『编程』这个工具了,其中很大一部分人用的是Python.大部分人只是做做简单的科研计算.绘图.办公自动化或者爬虫,但-- 这就不需要理解「指针与面向对象」了吗? 在 ...

  2. Scala学习笔记之伴生对象

    所谓伴生对象, 也是一个Scala中的单例对象, 使用object关键字修饰. 除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的 ...

  3. scala学习笔记——类和对象

    基础语法关于Scala程序,这是非常要注意以下几点. 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 类名 - 对于所有的类名的第一个字 ...

  4. scala学习手记15 - 独立对象和伴生对象

    上一节中的单例对象MarkerFactory 就是一个独立对象的例子.尽管它管理着Marker类,但是它并没有关联到任何类上. scala也可以创建关联到类上的对象.这样的对象同类共享同一个名字,这样 ...

  5. 【转载】 一文看懂深度学习新王者「AutoML」:是什么、怎么用、未来如何发展?

    原文地址: http://www.sohu.com/a/249973402_610300 原作:George Seif 夏乙 安妮 编译整理 ============================= ...

  6. 一个「学渣」从零开始的Web前端自学之路

    从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”. 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低 ...

  7. 「MoreThanJava」Day2:变量、数据类型和运算符

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  8. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  9. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...

随机推荐

  1. Python8_关于编码解码和utf-8

    关于编码:ASCII码是早期的编码规范,只能表示128个字符.7位二进制数表示 扩展ASCII码,由于ASCII码不够用,ASCII表扩充到256个符号,不同的国家有不同的标准:8位二进制数 Unic ...

  2. TCP/IP||ICMP

    1.概述 ICMP为IP组成部分之一,传递差错报文并返回用户进程,在IP数据报内部被传输 类型字段可以有15个不同的值,以描述特定类型的ICMP报文,检验和字段覆盖整个ICMP报文. 2.报文类型 在 ...

  3. 使用原生JDBC方式对数据库进行操作

    使用原生JDBC方式对数据库进行操作,包括六个步骤: 1.加载JDBC驱动程序 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM.可以通过java.lang.Class类的静态方法forNa ...

  4. $Noip2014/Luogu2312$ 解方程

    $Luogu$ $Sol$ 枚举解+秦九韶公式计算+取模. $Code$ #include<iostream> #include<cstdio> #include<cst ...

  5. $Poj1723/AcWing123\ Soldiers$ 排序

    $Poj$ $AcWing$ $Description$ $Sol$ 分别处理$x$坐标和$y$坐标.$y$坐标显然很好处理,就是排个序然后取中位数就好了.$x$没有$y$那么直接叭.所以我首先写了个 ...

  6. linux solr 安装

    1.官网下载solr任意版本 2.解压安装包 3.进入solr文件bin目录修改solr.in.sh中的SOLR_ULIMIT_CHECKS属性设置为false 4.启动solr 5.检查solr状态 ...

  7. Linux常用命令大全(一)

    Linux常用命令大全(一) 第一章 cal命令 $ cal 12 2017 :列出2017年12月的日历 $ cal 10 :列出公元10年的日历 $ cal 12 17 :列出公元17年12月的日 ...

  8. Linux学习之路--常用命令讲解

    Linux常用命令讲解 1.命令格式:命令 [-选项]  [参数] 超级用户的提示符是# 一般用户的提示符是$ 如:ls -la /usr说明: 大部分命令遵从该格式多个选项时,可以一起写 eg:ls ...

  9. 「学习笔记」珂朵莉树 ODT

    珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...

  10. 开源项目SMSS开发指南(二)——基于libevent的线程池

    libevent是一套轻量级的网络库,基于事件驱动开发.能够实现多线程的多路复用和注册事件响应.本文将介绍libevent的基本功能以及如何利用libevent开发一个线程池. 一. 使用指南 监听服 ...