Scala 学习(6)之「对象」
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)之「对象」的更多相关文章
- 【入门必看】不理解「对象」?很可能有致命bug:简单的Python例子告诉你
简介:越来越多的人要在学习工作中用到『编程』这个工具了,其中很大一部分人用的是Python.大部分人只是做做简单的科研计算.绘图.办公自动化或者爬虫,但-- 这就不需要理解「指针与面向对象」了吗? 在 ...
- Scala学习笔记之伴生对象
所谓伴生对象, 也是一个Scala中的单例对象, 使用object关键字修饰. 除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的 ...
- scala学习笔记——类和对象
基础语法关于Scala程序,这是非常要注意以下几点. 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 类名 - 对于所有的类名的第一个字 ...
- scala学习手记15 - 独立对象和伴生对象
上一节中的单例对象MarkerFactory 就是一个独立对象的例子.尽管它管理着Marker类,但是它并没有关联到任何类上. scala也可以创建关联到类上的对象.这样的对象同类共享同一个名字,这样 ...
- 【转载】 一文看懂深度学习新王者「AutoML」:是什么、怎么用、未来如何发展?
原文地址: http://www.sohu.com/a/249973402_610300 原作:George Seif 夏乙 安妮 编译整理 ============================= ...
- 一个「学渣」从零开始的Web前端自学之路
从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”. 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低 ...
- 「MoreThanJava」Day2:变量、数据类型和运算符
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式
1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...
随机推荐
- Python8_关于编码解码和utf-8
关于编码:ASCII码是早期的编码规范,只能表示128个字符.7位二进制数表示 扩展ASCII码,由于ASCII码不够用,ASCII表扩充到256个符号,不同的国家有不同的标准:8位二进制数 Unic ...
- TCP/IP||ICMP
1.概述 ICMP为IP组成部分之一,传递差错报文并返回用户进程,在IP数据报内部被传输 类型字段可以有15个不同的值,以描述特定类型的ICMP报文,检验和字段覆盖整个ICMP报文. 2.报文类型 在 ...
- 使用原生JDBC方式对数据库进行操作
使用原生JDBC方式对数据库进行操作,包括六个步骤: 1.加载JDBC驱动程序 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM.可以通过java.lang.Class类的静态方法forNa ...
- $Noip2014/Luogu2312$ 解方程
$Luogu$ $Sol$ 枚举解+秦九韶公式计算+取模. $Code$ #include<iostream> #include<cstdio> #include<cst ...
- $Poj1723/AcWing123\ Soldiers$ 排序
$Poj$ $AcWing$ $Description$ $Sol$ 分别处理$x$坐标和$y$坐标.$y$坐标显然很好处理,就是排个序然后取中位数就好了.$x$没有$y$那么直接叭.所以我首先写了个 ...
- linux solr 安装
1.官网下载solr任意版本 2.解压安装包 3.进入solr文件bin目录修改solr.in.sh中的SOLR_ULIMIT_CHECKS属性设置为false 4.启动solr 5.检查solr状态 ...
- Linux常用命令大全(一)
Linux常用命令大全(一) 第一章 cal命令 $ cal 12 2017 :列出2017年12月的日历 $ cal 10 :列出公元10年的日历 $ cal 12 17 :列出公元17年12月的日 ...
- Linux学习之路--常用命令讲解
Linux常用命令讲解 1.命令格式:命令 [-选项] [参数] 超级用户的提示符是# 一般用户的提示符是$ 如:ls -la /usr说明: 大部分命令遵从该格式多个选项时,可以一起写 eg:ls ...
- 「学习笔记」珂朵莉树 ODT
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...
- 开源项目SMSS开发指南(二)——基于libevent的线程池
libevent是一套轻量级的网络库,基于事件驱动开发.能够实现多线程的多路复用和注册事件响应.本文将介绍libevent的基本功能以及如何利用libevent开发一个线程池. 一. 使用指南 监听服 ...