Scala学习笔记

来源:互联网 发布:bershka 知乎 编辑:程序博客网 时间:2024/06/02 03:17

object 的意义

需要某个类的单个实例

想为其他值或函数找一个可以挂靠的地方

 

 

第6章 对象a1 69

6.1 单例对象 69

scala没有静态方法,字段

理论上 object 是来代替这个功能的

object Accounts {

private var lastNumber = 0

def newUniqueNumber() = { lastNumber += 1; lastNumber }

}

调用为(调用的时候很像静态成员的使用)

Account.newUniqueNumber()

 

单例对象基本拥有类的所有特性,只有一个例外,不能提供构造器参数

 

一般单例的用法

作为存放工具函数或常量的地方

高效地共享单个不可变实例

需要用单个实例来协调某个服务

 

 

6.2 伴生对象 70

java中通常会有需要使用实例方法又要使用静态方法的类

scala中可以通过 伴生对象 来实现

类和它的伴生对象可以相互访问私有特性,但必须存在于同一个源文件中

 

class Account{

 

}

object Account{ //伴生对象

 

}

 

 

6.3 扩展类或特质的对象 71

一个object可以 扩展类 以及 一个或者多个特质

其结果是一个扩展了指定类以及特质的类的 对象,同时拥有在对象中定义给出的 所有特性

 

书中例子,意思是想表达单例继承(扩展)了类或者特质,是会拥有里面的所有特性

 

类只能继承一个,但是特质可以继承多个

但是获得所有特性的方式是,从继承方向,从左包到右

 

 

6.4 apply方法 72

自己根据强哥的讲课做的例子

applyTest(),这个地方算是语法糖的节奏吧

这个地方对主构造器还是有点晕

 

当遇到如下形式的表达式,apply方法就会被调用

(object是个对象,或者是方法名)不知道这样理解对不对

object(参数1,参数2......)

通常,这样的一个apply方法返回的是伴生类的对象

 

书中例子,这个地方没怎么明白

Array对象定义apply方法,可以通过如下创建数组

Array("a","b","c")

为什么不用构造器呢,对于嵌套表达式而言,省去new会方便很多

Array(Array(1, 7), Array(2, 9))

 

但是这个例子能明白

Array(100) 和 new Array(100) 这两个是不同的

Array(100) 是调用了 Array.apply(100) 返回的是Array[Int]

new Array(100) 是调用的构造器 this(100) 返回的是Array[Nothing] 包含了100个null元素

 

另一个例子

 

 

看了下Array的apply方法源码,Array里实现了各个基本数据类型的apply方法,实现(添加数据|实例化?)

 

 

6.5 应用程序对象 73

继承 app 可以免写main函数

但是这种方式在实际生产中不建议使用

还是老老实实写main靠得住些

 

 

6.6 枚举 74

Enumeration 助手类

定义一个扩展Enumeration类的对象 并以value方法调用 初始化枚举中的所有可选值

暂时看不懂,晚点再看

 

练习75

原创粉丝点击