虽然java一直声称自己是完全面向对象的语言,但一直以来都被很多人所质疑,其中java的静态成员函数就是主要的“罪魁祸首”。由于java中保留了静态方法的调用,导致其编程模式依然有过程式编程的可能,尤其是在静态方法被滥用的当下(一个顽固的面向过程程序员完全可以将他的过程思维用一大推静态方法实现,而class仅仅只是个空有其表的外壳而已)

所以在scala中,设计者摒弃了static关键字,宣称自己是完全面向对象的,似乎更有说服力。。。

但是我们在编程中有时确实需要用到一般功能性函数,例如工具函数、工厂设计模式等。怎么办呢?compaion object(伴生对象)闪亮登场!

什么是compaion object?很简单,(一般在同一个文件中)同时定义了一个class,以及与这个class同名的object,那么这个object就是这个class的伴生对象,这个class就是这个object的伴生类。。。是不是有点拗口,其实就可以看成命运共同体啦╮(╯▽╰)╭

以class A,object A为例,有了compaion object之后,就可以将object A的作用域理解为静态域,在该object A中定义的任何变量、常量、方法X,均可以在对应的访问权限下通过A.X直接访问;这两个命运共同体的内部特殊点在于可以访问彼此的私有成员,class A里可以通过A.X访问object的私有成员,而object中可以访问某个class A对象的私有成员a.XX。注意这里理解容易出错,object A虽然是class A的伴生对象,但它不是A的对象,所以它本身不具备A的一切成员和方法,他只是一个特殊的作用域,因此它内部不能直接访问class A的成员变量

talk is cheap, show you my code~

package basic.test
class Cat{
private var name = "Tom"
private var age = 0
def run = println("A cat " + name + " is running...")
def classify = println("It is a " + Cat.category)//注意这里访问了object Cat的私有成员
override def toString = "Cat{name:" + name + ",age:" + age + "}"
} object Cat{
private val category = "Animal"
//如果这里试图在函数中直接访问name、age,都报错,例如
//def createCat = {
//  println(name + age)
//}//报错无法找到name和age
def createCat = {
var res = new Cat
res.name = "Created Tom"//注意这里直接访问修改class Cat的私有成员变量
res.age = 1//注意这里直接访问修改Cat的私有成员变量
     res
  } 
}

scala> import basic.test.Cat
  import basic.test.Cat

scala> var a = new Cat
a: basic.test.Cat = Cat{name:Tom,age:0} #这里直接调用Cat的工厂方法
scala> Cat.createCat
res0: basic.test.Cat = Cat{name:Created Tom,age:1} scala> a.classify
It is a Animal

上边的例子一目了然,如果你还没看懂,去看看本教程前边的内容吧~

scala成长之路(4)compaion object——伴生对象的使用的更多相关文章

  1. scala成长之路(3)隐式转换

    不废话,先上例子:定义一个参数类型为String的函数: scala> def sayHello(name:String) = println("hello " + name ...

  2. scala成长之路(6)函数入门

    众所周知,scala作为一门极客型的函数式编程语言,支持的特性包括: 函数拥有“一等公民”身份: 支持匿名函数(函数字面量) 支持高阶函数 支持闭包 部分应用函数 柯里化 首先需要指出,在scala中 ...

  3. scala成长之路(5)问题记录

    还是在看scala sdk源码的时候,有很多问题要考自己慢慢摸索,这里做个记录. 一. 隐式转换的作用域? 隐式转换需要三个因素 1. 己方(当前对象) 2. 转换函数 3. 对方(转换的目标类) 这 ...

  4. scala成长之路(2)对象和类

    scala提供了一种特殊的定义单例的方法:object关键字 scala> object Shabi{ | val age = 0 | val name = "shabi" ...

  5. scala成长之路(7)函数进阶——可能是史上最浅显易懂的闭包教程

    由于scala中函数内部能定义函数,且函数能作为函数的返回值,那么问题来了,当返回的函数使用了外层函数的局部变量时,会发生什么呢?没错,就产生是闭包. 关于闭包的解释网上一大堆,但基本上都是照葫芦画瓢 ...

  6. scala成长之路(1)基本语法和数据类型

    scala作为JVM上的Lisp,是一种geek类型的编程语言,也一直是我等java程序员眼中的梦寐以求的一门技能,遂下定决心花一段时间好好学习scala.第一天学习,主要介绍与java在编程上的主要 ...

  7. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...

  8. Scala学习笔记(二):object、伴生对象和基本类

    object object 是只有一个实例的类.它的定义与Java中的class类似,如: // 单例对象 object AppEntry { def main(args: Array[String] ...

  9. 第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法

    6.    类.对象.继承.特质 Scala的类与Java.C++的类比起来更简洁,学完之后你会更爱Scala!!! 6.1.   类 6.1.1.    类的定义 package cn.itcast ...

随机推荐

  1. oracle查询时间

    oracle查询和时间有关的命令: 方法一:select * from dual where time between to_date('2012-06-18 00:00:00','yyyy-mm-d ...

  2. CSS和文档流

    1.  CSS的定位机制有3种:普通流.浮动和定位. 2.  文档流:从上到下,从左到右,一个挨一个的简单或者叫正常布局. 3.  定位:(position) Static:保持文档流. Relati ...

  3. python中文入库

    http://www.cnblogs.com/evening/archive/2012/04/19/2457440.html 工作需要,将cvm.csv文件中的记录志入数据库, name, owner ...

  4. Python学习笔记之发展史、简介以及特点

    Python发展史 Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的. Python 本身也是由诸多其他语言发展而来的,这包括 ...

  5. Struts的学习-eclipse与idea与struts的连接

    1.建立一个空白工程(里面是没有文件的). 可以在文件放置找到项目文件夹 2.点击托管项目到码云 (ps:没有码云帐号的自己注册) 3.按快捷键:ctrl+alt+shift+s 呼出项目结构管理器, ...

  6. Smart template的控件能否当成普通控件来用

    我的同事问过我这个问题: 只要弄清楚Smart control的原理,就能回答这个问题. 答案是: smart control可以像普通的控件一样在xml view中被定义和使用,但是必须结合ODat ...

  7. python接口测试-项目实践(一) 测试需求与测试思路

    测试需求: 第三方系统提供了3个接口,需要测试前端显示的字符串里的对应数据与接口数据是否一致. 测试分层: 开发人员的设计:每周从接口取一次数据,拼接完成后保存到数据库.再从数据库取数提供接口给前端开 ...

  8. RF脚本中的坑2: pip下载python库时报certificate verify failed

    用pip命令下载第三方library时,报错certificate verify failed,截图如下: 在网上找了各种教程,包括修改了pip下载源地址也无效果,最后祭出了杀手锏——FQ,FQ成功后 ...

  9. escape,unescape与encodeURIComponent,decodeURIComponent

    escape:将string转成unicode字符串 escape('

  10. fast、faster中ap值的计算

    def voc_ap(rec, prec, use_07_metric=False): """ ap = voc_ap(rec, prec, [use_07_metric ...