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 ...
随机推荐
- dotnet 新项目格式与对应框架预定义的宏
在 sdk style 的项目格式支持使用多框架开发,此时需要在代码里面通过宏判断,在编译的时候执行不同的代码.本文告诉大家在框架里面对应的预定义的条件编译符有哪些 在让一个 csproj 项目指定多 ...
- kafka性能测试代码
bin/kafka-producer-perf-test.sh --num-records 5000000 --record-size 5000 \ --topic kafkatopic2 \ --b ...
- codeforces 1167B Lost Numbers
传送门:https://codeforces.com/contest/1167/problem/B 题意: 交互题:现在你有6个数4, 8, 15, 16, 23, 42组成的某种组合,你可以询问系统 ...
- Apache的DBUtils框架学习(转)
一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化 ...
- 我们基于kaldi开发的嵌入式语音识别系统升级成深度学习啦
先前的文章<三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的>说我们花了不到三个月的时间搭了一个基于kaldi的嵌入式语音识别系统,不过它是基于传统的GMM-HMM的 ...
- [Ljava.lang.String;@3e5084c9:是一个字符串数组的字节码表示
[Ljava.lang.String;@3e5084c9:是一个字符串数组的字节码表示 打印一个字符串数组的话,会发现 String[] arr = new String[10]; // String ...
- flask迁移数据库时报错:Target database is not up的解决方案
在flask中进行数据库迁移时报错,报错信息为"Target database is not up",解决方案如下 找到alembic的最新版本号,找到文件夹migrate下的最新 ...
- Verilog门级建模
门级建模就是将逻辑电路图用HDL规定的文本语言表示出来,即调用Verilog语言中内置的基本门级元件描述逻辑图中的元件以及元件之间的连接关系. Verilog语言内置了12个基本门级元件模型,如下表所 ...
- 「USACO08JAN」电话线Telephone Lines 解题报告
题面 大意:在加权无向图上求出一条从 \(1\) 号结点到 \(N\) 号结点的路径,使路径上第 \(K + 1\) 大的边权尽量小. 思路: 由于我们只能直接求最短路,不能记录过程中的具体的边--那 ...
- JS中常见的几种继承方法
1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...