Scala学习六——对象
一.本章要点
- 用对象作为但例或存放工具的方法
- 类可以拥有一个同名的伴生对象
- 对象可以扩展类或特质
- 对象的apply方法通常用来构造伴生类的新实例
- 如果不想显示定义main方法,可以扩展App特质的对象
- 你可以通过扩展Enumeration对象来实现枚举
二.单例对象
Scala没有静态方法或静态字段,可以使用object语法结构达到同样的目的,对象定义了某个类的单个实例,包含了你想要的特性。
例:直接调用Accounts.newUniqueNumber()就可以创建一个新的唯一帐号,对象的构造器在该对象第一次被使用时调用,如果从未调用,则不会执行构造器。对象本质可以拥有类的所有特性,但是不能提供构造器参数。
object Accounts{
private var lastNumber=0
def newUniqueNumber()={lastNumber+=1;lastNUmber}
}

三.伴生对象
在Java/C++中,通常使用到既有实例方法又有静态方法的类,在Scala中就可以通过类和类同名的”伴生“对象来实现,例:
class Account{
val id=Account.newUniqueNumber()
private var balance=0.0
def deposit(account:Double){
balance+=amount
}
}
object Account{
//伴生对象
private var lastNumber=0
private def newUniqueNumber()={lastNumber+=1;lastNumber}
}
注:类和它的伴生对象可以相互访问私有属性,但是需要存在于同一个源文件中;

四.扩展类或特质的对象
一个object可以扩展类以及一个或多个特质,其结果是一个扩展了指定类以及特质的类的对象,同时拥有在对象中给定的所有特性。
五.apply方法
通常会定义和使用apply方法,当遇到Object(参数1,...,参数N)时,apply方法会被调用(通常apply方法返回的是一个伴生类的对象),如Array对象定义了apply方法,Array(Array(1,7),Array(2,9))而不用构造器,可以更加方便,省去new。
例:
class Account private(val id:Int,initialBalance:Double){
private var balance=initialBalance
...
}
object Account{
//伴生对象
def apply(initialBalance:Double)={
new Account(newUniqueNumber(),initiaBalance)
}
}
六.应用程序对象
- 每个Scala程序都必须从一个对象的main方法开始,这个方法类型为Array[String]=>Unit;
object Hello{
def main(args:Array[String]){
println("Hello")
}
}
- 当然也可以扩展App特质,将程序代码放入构造器
object Hello extends App{
println("Hello")
}
- 如果需要命令参数,则可以通过args属性(应用设置scala.time[-Dscala.time]时程序退出会显示逝去的时间)
object Hello extends App{
if(args.length>0){
println("Hello,"+args(0))
else{
println("Hello")
}
}
}
注:App特质扩展自另一个特质DelayedInit,编译器对该特质有特殊的处理。所有带该特质的类,其初始化方法都会被挪到delayedInit方法中(查看API可知Scala2.13.1已经弃除)App特质的main方法捕获到命令参数,调用delayedInit方法,并且可以根据要求打印逝去的时间。
七.枚举
和Java或C++不同,Scala并没有枚举类型,不过,标准库提供了一个Enumeration助手类,可以用于产出枚举。
object TrafficLightColor extends Enumeration{
val Red,Yellow,Green=Value
}
每次调用Value方法都返回内部类的新实例,该内部类也叫Value。
也可以向Value传入ID,名称,或两个参数都传(如果不指定,则ID就会将前一个枚举基础上加一,从零开始,缺省名称为字段名)。
注:通过TrafficLightColor.Red来引用枚举值(也可以直接import TrafficLightColor._直接应用),枚举的类型为TrafficLightColor.Value而不是TrafficLightColor(拥有这些值的对象);

枚举值的ID通过id方法返回,名称通过toString方法返回。
输出所有的枚举值:
for(c <- TrafficLightColor.values println(c.id+":"+c))
通过ID或名称定位:
TrafficLightColor(0) //调用Enumeration.apply
TrafficLightColor.withName("Red")
八.练习


1.
object Conversations {
private val i2c: Double = 30.48
private val g2l: Double = 3.785411784
private val m2k: Double = 1.609344
def inchesToCentimeters(inc: Double): Double = {
inc * i2c
}
def gallonsToLiters(gal: Double): Double = {
gal * g2l
}
def milesTokilometers(mil: Double): Double = {
mil * m2k
}
def main(args: Array[String]): Unit = {
println(inchesToCentimeters(10))
println(gallonsToLiters(10))
println(milesTokilometers(10))
}
}
2.
abstract class UnitConversion {
def Converse(comn: Double): Double
}
object InchesToCentimeters extends UnitConversion {
private val i2c: Double = 30.48
override def Converse(comn: Double) = {
i2c * comn
}
}
object GallonsToLiters extends UnitConversion {
private val g2l: Double = 3.785411784
override def Converse(comn: Double): Double = {
g2l * comn
}
}
object MilesTokilometers extends UnitConversion {
private val m2k: Double = 1.609344
override def Converse(comn: Double): Double = {
m2k * comn
}
}
object Test {
def main(args: Array[String]): Unit = {
println(InchesToCentimeters.Converse(10))
println(GallonsToLiters.Converse(10))
println(MilesTokilometers.Converse(10))
}
}
3.
4.
5.
6.
7.
8.
Scala学习六——对象的更多相关文章
- Scala学习(六)---Scala对象
Scala中的对象 摘要: 在本篇中,你将会学到何时使用Scala的object语法结构.在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,你就会用到它.本篇的要点包括: 1. ...
- Scala学习(六)练习
Scala中的对象&练习 1. 编写一个Conversions对象,加入inchesToCentimeters,gallonsToLiters和milesToKilometers方法 程序代码 ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...
- C#多线程学习(六) 互斥对象
如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
- [Scala]Scala学习笔记六 文件
1. 读取行 读取文件,可以使用scala.io.Source对象的fromFile方法.如果读取所有行可以使用getLines方法: val source = Source.fromFile(&qu ...
- 入门大数据---Scala学习
Scala是什么? Scala是一种基于函数式编程和面向对象的高级语言.它开发了Spark等大型应用.它和Java有效集成,底层也是支持JVM的. 它有六大特性: 无缝JAVA互操作 Scala在JV ...
- 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习
下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...
- Hbase深入学习(六) Java操作HBase
Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...
随机推荐
- 【面试】ArrayList 和 HaseMap 的区别和应用场景
ArrayLiat: ArrayList array = new ArrayList(); array.add("张三"); array.add("李四"); ...
- 2018-2019-2 20165330《网络对抗技术》Exp8 Web基础
目录 基础问题 相关知识 实验内容 实验步骤 实验总结与体会 实验内容 Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML ...
- js判断是否联网
// navigator.onLine if (navigator.onLine){ //正常工作 console.log("在线状态............................ ...
- JS基础_垃圾回收(GC)
垃圾回收(GC) 程序运行过程中也会产生垃圾,这些垃圾积攒过多以后,会导致程序运行的速度过慢,所以我门需要一个垃圾回收的机制,来处理程序运行过程中产生的垃圾 当一个对象没有任何的变量或属性对它进行引用 ...
- js中几种动态创建元素并设置文本内容的比较,及性能测试。
内容 1 appendChild (都兼容) 2.insertAdjacentHTML (都兼容) 3.innerHTML (都兼容) 4.createDocumentFragment (都兼容) 动 ...
- legend3---8、烦请节约时间
legend3---8.烦请节约时间 一.总结 一句话总结: 时间不要浪费在垃圾情绪和无效社交上面. 1.商标不能以个人的名义注册? 可以先注册个体工商户,然后再可以注册商标 2.注册一个商标大概花多 ...
- 【Taro全实践】Taro在微信小程序中的生命周期
一.Taro的本身生命周期 生命周期componentWillMount在微信小程序中这一生命周期方法对应页面的onLoad或入口文件app中的onLaunch componentDidMount在微 ...
- 短信的内容提供者Uri和短信表结构
* sms表 * address :手机号码 * date :收发短信的时间 * read :短信的阅读状态 1,已读 0,未读 * type :收发短信的类型 1,收到短信 2,发出短信 * bod ...
- Java对象和集合的拷贝/克隆/复制
昨天同事遇到了一个奇怪的问题,他需要将一个JavaBean拷贝一份,然后对新创建的Bean进行操作.但是他对新的Bean操作后,会影响旧的Bean的值.当听到这个问题的时候,我第一反应就是他的拷贝方法 ...
- Oracle动态执行脚本创建序号
-----------------------动态创建序列的脚本--------------------------- declare type num_list ) ); -- 老师表.学生表 xz ...