虽然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. 树莓派3(Raspberry pi 3)刷OpenWrt

    原文在 https://my.oschina.net/wangandi/blog/687389 1.下载镜像,这个lede好像是openwrt的一个分支,openwrt本身还没有支持pi3,https ...

  2. html表格设置

    表格 表格由 <table> 标签来定义.每个表格均有若干行(由 <tr> 标签定义),每行被分割为若干单元格(由 <td> 标签定义).字母 td 指表格数据(t ...

  3. 如何禁用 Azure 虚拟机的日期时间同步

    问题描述 由于 Azure 虚拟机的特殊性,物理主机会实时同步虚拟机的时间和日期.当有特殊需求时,客户想要停止日期时间的同步,但是一些常见的关闭 NTP 服务等操作都会失败. 解决方案 Importa ...

  4. 我的HTML总结之HTML发展史

    HTML是Web统一语言,这些容纳在尖括号里的简单标签,构成了如今的Web. 1991年,Tim Berners-Lee编写了一份叫做“HTML标签”的文档,里面包含了大约20个用来标记网页的HTML ...

  5. Visual Studio 2012 未找到与约束 ContractName问题,及printf unsafe问题

    1.用VS 2012 创建c++项目失败,提示未找到与约束 ContractName .............的错误 解决办法:下载VS 2012 补丁,很小的一个补丁,不过很管用 地址:http: ...

  6. GCO团队合作

    队名:GCO 队员:   B20150304116谢冰媛 (组长) B20150304401王粲 B20150304115钟玺琛            B20150304226梁天海          ...

  7. Jmeter入门18 Jmeter添加cookie的两种方式

    jmeter中添加cookie可以通过配置HTTP Cookie Manager,也可以通过HTTP Header Manager,因为cookie是放在头文件里发送的. 实例:博客园点击添加新随笔  ...

  8. MySQL:数据库入门篇2

    #移除主键时需要先解除递增,才能解除主键 alter table info modify id int null , drop PRIMARY key 一.用户权限 1.创建用户 create use ...

  9. 【[SCOI2010]生成字符串】

    \(n=m\)时候经典的卡特兰 那\(n!=m\)呢,还是按照卡特兰的方式来推 首先总情况数就是\(\binom{n+m}{n}\),在\(n+m\)个里选择\(n\)个\(1\) 显然有不合法的情况 ...

  10. 【转】Android listview与adapter用法

    一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常 ...