虽然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. Android Proguard.flags LOCAL_PROGUARD_FLAGS

    在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了.所以,在JNI应用中该慎用progurad啊. 解决办法: 1.在An ...

  2. PowerDesigner 连接数据库(以MySQL)为例

  3. Flume的load-balance、failover

    配置flume集群参考https://www.cnblogs.com/jifengblog/p/9277793.html load-balance负载均衡 介绍 负载均衡是用于解决一台机器(一个进程) ...

  4. 在浏览器的市场上,IE依然是放弃了,firefox还在继续~~

    自从微软失败后,发布了Edge:但是依然是没有多少市场的,毕竟各种难受: 单从开发者工具,我是没有其它选择了, ie的不能用,https://www.microsoft.com/en-us/welco ...

  5. 收放卷及张力控制 PID调试技巧

    1) 小 Kp( 0.01) , 大 Ti ( 20000ms) 2)逐渐增大Kp, 减小Ti ( 20000ms – 3000ms),避免发生震荡 3)观察I-out 是否在0附近 可能原因:卷径不 ...

  6. libxml

    /** * section: Tree * synopsis: Navigates a tree to print element names * purpose: Parse a file to a ...

  7. 团队合作学习scrum

    查找资料学习scrum心得: 什么是scrum : scrum是一种轻量级软件开发方法,即一种做事的方法.scrum原本是指橄榄球运动的一个专业术语,原意为团队通力合作,在场地内传球.这个过程需要认真 ...

  8. [18/11/7] Java的基础概念

    java语言的优势是跨平台 ,计算机界的英语,是IT行业的第一大语言 特点是多线程 分布式 健壮性 面向对象 java和JavaScript的关系 雷锋和雷峰塔的关系 或卡巴斯基和巴基斯坦的关系有个基 ...

  9. Fiddler拦截并动态修改网页内容简易教程

    Fiddler默认可以拦截全局http请求,再加上它具备的脚本功能,可以很简单的达到动态修改网页内容的目的. 1.启动Fiddler 2.打开Rules->Customize Rules..., ...

  10. Docker 安装tomcat7

    [root@VM_0_7_centos ~]# docker pull tomcat:7-jre7 [root@VM_0_7_centos ~]# docker run -di --name=tomc ...