对象:Object
1.单例对象
2.伴生对象
3.扩展类或特质的对象
4.apply方法
5.应用程序对象
6.枚举
1.单例对象
Scala中没有你静态方法或静态字段,可以用object这个语法结构来实现这个目的。对象定义某个类的单个实例,包含了你想要的特性

object ObjectOps {
private var lastNumber = 0
def newUniqueNumber() = {lastNumber+=1;lastNumber}
/*
*对象的构造器在该对象第一次被使用时调用,在本例中,ObjectOps的构造器在Object.newUniqueNumber()的首次调用时执行
* 如果一个对象从未被使用,那么他的构造器也从未被调用
* 对象本质上会拥有类的所有特性,只有一个例外——不能提供构造器参数
* 对于在Java中使用单例对象的地方,在Scala中都可以用对象来实现
* 1.作为存放工具函数或常量的地方
* 2.高效的共享单个不可以变实例
* 3.需要单个实例来协调某个服务时
*/
}

2.伴生对象
在Java中你会用到既有实例方法又有静态方法的类
在Scala中你可以通过类与类同名的伴生对象来实现
 class Accounts {
//l类和它的伴生对象可以互相访问私有属性,但是必须在同一个源文件中
val id = Accounts.newUniqueNumber()
private var balance = 0.0
def deposit(amount : Double){balance += amount}
}
/*
*说明:类的伴生对象可以被访问,但并不在作用域中,如上,Accounts类必须通过Accounts.newUniqueNumber()而不是直接
* newUniqueNumber()来调用伴生对象的方法
*/
object Accounts{ //伴生对象
private var lastNumber = 0
private def newUniqueNumber() = {lastNumber+=1;lastNumber}
}
3.扩展类或特质的对象
一个object可以扩展类以及一个或多个特质,其结果是一个扩展了指定类以及特质的类的对象,同时拥有在对象定义中给出的所有特性
 //一个有用的使用场景是给出可被共享的缺省对象eg:在程序中引入一个可撤销动作的类
abstract class UndoableAction(val desctiption : String ) {
def undo() : Unit
def redo() : Unit
} object DoNotingAction extends UndoableAction("Do Thing"){
override def undo(): Unit = {} override def redo(): Unit = {}
//DoNotingAction对象可以被所有需要这个缺省行为的地方公用
val actions = Map("open" -> DoNotingAction,"save" -> DoNotingAction)
}

4.apply方法

Object(参数列表),此时apply方法会被调用
这样返回的是半生类的对象
Array对象定义了apply方法,我们可以这样来创建数组
Array("John","had","Alice")
为什么不用构造器呢?对于嵌套表达式而言,省去new会方便很多
Array(Array(1,2),Array("a","b"))
 class Account private (val id : Int ,initialBalance : Double){
private var balance = initialBalance
} object Account{
private var lastNumber = 0
private def newUniqueNumber() = {lastNumber+=1;lastNumber}
def apply(initialBalance : Double): Unit ={
new Account( newUniqueNumber(),initialBalance )
}
//这样一来就可以如下这种方式来构造账号了: def main(args: Array[String]): Unit = {
val acct = Account(1000.0) }
}
5.应用程序对象
每个Scala程序都必须从一个对象的main方法开始。,这个方法的类型为Array[String]=>Unit:
 object Hello1 {
def main(args: Array[String]): Unit = {
println("Hello world")
}
}
// 除了每次都提供main方法外,你也可以扩展APP特质,然后将程序代码放入构造器方法体内
object Hello2 extends App{
println("Hello world")
//如果怒需要命令行参数,则可以通过args属性得到:
if(args.length > 0){
println("hello" + args(0))
}else{
println("Hello world")
}
}
6.枚举
和Java不一样,Scala中没有枚举类型,不过标准类库提供了一个Enumeration助手类,用于产出枚举
定义一个扩展Enumeration类的对象,并以Value方法调用初始化枚举中的所有可选值
object EnumOps extends Enumeration{
//val Red,Yellow,Blue = Value
/*
*在这里我们定义了三个字段Red,Yellow,Blue,然后用value调用将他们初始化,这是如下代码的简写
* val Red = Value
* val Yellow = value
* val Blue = value
* 每次调用都会返回内部类的新实例,该内部类叫Value
* 或者你也可以向Value传入ID,名称,或者两个都传
*/
val Red = Value(0,"Stop")
val Yellow = Value(10)
val Blue = Value("GO")
//如果不指定,则ID将前一个枚举值基础上加1,从零开始,缺省名称为字段名
//定义完成后就可以通过EnumOps.Red来引用枚举值了
//也可以通过 import EnumOps._ } object LightColor extends Enumeration{
type LightColor = Value
val Red,Yellow,Blue = Value import LightColor._
def doWhat(color : LightColor): Unit ={
if(color == Red) "Stop"
else if(color == Yellow) "hurry up"
else "Go"
}
//枚举值的ID可以通过ID方法返回,名称通过toString返回
def main(args: Array[String]): Unit = {
for(c <-LightColor.values) println(c.id +":"+ c)
//最后,你可以通过枚举值或名称来查找定位
LightColor(0)
LightColor.withName("Red")
}
}
 
 
 
 

Scala(四):对象的更多相关文章

  1. Netty4.x中文教程系列(四) 对象传输

    Netty4.x中文教程系列(四)  对象传输 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个U ...

  2. JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

    一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...

  3. scala伴生对象

    package com.test.scala.test /** * 伴生对象指的是在类中建立一个object */ class AssociatedObject { private var count ...

  4. Scala Singleton对象

    Scala Object: scala没有静态的修饰符,例如Java中的static.但是Scala提供了Object类型,object下的成员都是静态的,比较像Java的静态类.不同在于Scala的 ...

  5. Scala(四) —— 集合

    一.List var x = List(1,2,3,4) //x:List[Int] = List(1, 2, 3, 4) var y = List("x","y&quo ...

  6. Scala函数式对象-有理数

    有理数类的表示 实现规范:支持有理数的加减乘除,并支持有理数的规范表示 1.定义Rational 首先,考虑用户如何使用这个类,我们已经决定使用“Immutable”方式来使用Rational对象,我 ...

  7. Scala可变对象

    Java提供JavaBean作为数据对象的封装, 而对于Scala来说也提供了同样的支持. class Apple { var weight: Float = _ var color: String ...

  8. 6、scala面向对象-对象

    一.对象 1.object object,相当于class的单个实例,通常在里面放一些静态的field或者method,第一次调用object的方法时,就会执行object的constructor, ...

  9. scala 判断对象相等/equals

    package scala_enhance.scalaextends import scala.collection.mutable.HashMap /** * scala中判断对象相等 * 原则: ...

随机推荐

  1. JQuery 选择器 筛选器

    什么是jQuery对象 参考:http://jquery.cuishifeng.cn/css.html jQuery 对象就是通过jQuery包装DOM对象后产生的对象.jQuery 对象是 jQue ...

  2. EBS请求定义成菜单

    1. 将请求定义为“功能”路径:系统管理员 –应用产品-函数输入自定义的功能名称,用户功能名以及说明   “特性”TAB页: 类型选择“表单”,其余两个字段默认:在表单TAB页: 表单字段:选择“运行 ...

  3. 【Oracle】PL/SQL Developer使用技巧(持续更新中)

    1.关键字自动大写 在sql命令窗口中输入SQL语句时,想要关键字自动大写,引人注目该怎么办呢? 一步设置就可以达成了.点击Tools->Preference->Editor,看到截图中这 ...

  4. ASP.NET Web API 跨域访问(CORS)要注意的地方

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  5. 名词解释:Linux内存管理之RSS和VSZ

    Linux内存管理中不管是top命令还是pmap命令,都会有RSS和VSZ这两个名词,这里解释一下: RSS( Resident Set Size )常驻内存集合大小,表示相应进程在RAM中占用了多少 ...

  6. nodepad++添加新主题

    https://www.cnblogs.com/d0main/p/6915460.html

  7. Python读写oracle数据库

    最近项目中需要用到Python调用oracle实现读写操作,踩过很多坑,历尽艰辛终于实现了.性能怎样先不说,有方法后面再调优嘛.现在把代码和注意点记录一下. 1. 所需Python工具库 cx_Ora ...

  8. QT5.8连接Mysql提示QMYSQL driver not loaded

    我们都知道在QT5.8系列里已经带了Mysql的dll文件 驱动的名字为“qsqlmysql.dll”和“qsqlmysqld.dll” 但是按照网上的各种教程和博客基本都是错的,只有个别人是对的. ...

  9. Tomcat6的相关配置

    1. Tomcat无安装部署: 本文windows用的是win7,ubuntu用的是12.04 LTS,tomcat版本是1.6 1.1. windows上的tomcat无安装部署 1.1.1. 确认 ...

  10. Java阶段性总结与获奖感想

    一.获奖感想 这次能获得小黄衫,可以说是对我自己这半学期以来努力学习的一种肯定,也是激励我继续努力的动力. 首先,我要感谢给予我们耳目一新的学习方式的娄老师.我曾在我期望的师生关系中提到,我的高中班主 ...