文档章节

函数式对象之辅助构造器

柳哥
 柳哥
发布于 2014/06/06 16:26
字数 486
阅读 98
收藏 0
点赞 0
评论 0

有些时候一个类里需要多个构造器。Scala里主构造器之外的构造器被称为辅助构造器。比方说,分母为1的有理数只写分子的话就更简洁。因此,Rational(5,1)简写成Rational(5)或许感觉会更好些。而这就需要给Rational添加只传入分子的辅助构造器并预先设定分母为1。如例:

package scalaTest
class Rational(n:Int,d:Int) {
    require(d != 0)
    val number:Int = n
    val denom:Int = d
    def this(n:Int) = this(n,1)    //辅助构造器
    override def toString = number + "/" + denom
    def add(that:Rational):Rational = {
        new Rational(number * that.denom + that.number * d , d * that.denom)
    }
    def lessThan(that:Rational) = {
        this.number * that.denom < that.number * this.denom
    }
    def max(that:Rational) = {
        if(this.lessThan(that)) that else this
    }
}

Scala的辅助构造器定义开始于def this(....)。函数主体几乎完全是主构造器的调用,并传递了参数n做分子和1做分母。Scala里的每个辅助构造器的第一个动作都是调用同类其它的构造器。换句话说就是,scala类的每个辅助构造器都是以“this(......)”形式开头的。被调用的构造器既可以是主构造器,也可以是其它已定义的辅助构造器。规则的根本结果就是每个scala的构造器调用终将结束于对主构造器的调用,因此主构造器是类的唯一入口点

注意
若熟悉java,你或许会奇怪为什么scala构造器的规则比java的还要严格。Java里构造器的第一个动作只有两个选择:要么调用同类的其他构造器,要么直接调用超类的构造器。Scala类里面只有主构造器可以调用超类的构造器。Scala里这种严格的限制实际上是为了让scala的构造器与java构造器相比更为清晰和简洁而付出的代价。

© 著作权归作者所有

共有 人打赏支持
柳哥
粉丝 202
博文 394
码字总数 347782
作品 0
杭州
技术主管
函数(Functions)

问题: 有多少种函数声明的方式? 不同函数类型如何影响上下文的变量对象? 知识点: 函数 在ECMAScript中,有三中函数类型:函数声明,函数表达式和函数构造器创建的函数。 ---函数声明FD ...

KaronChen ⋅ 2015/08/23 ⋅ 0

Scala笔记整理(四):Scala面向对象—类详解2(继承相关)

[TOC] 单例 希望某个类只存在一个使用的对象,而不管有多少个调用者在使用它,就是单例的概念。 Java中的单例 Scala中的单例 代码及说明如下: 输出结果如下: 伴生类和伴生对象 直接看下面的...

xpleaf ⋅ 04/20 ⋅ 0

继承中子类的构造器调用父类的构造器

构造器的作用:初始化对象的成员变量。 构造器不能被子类继承,普通方法和属性可以被子类继承。 默认情况下,子类的构造器中的第一行隐式地调用父类默认的无参构造器,以初始化父类的成员变量...

恒者 ⋅ 2013/12/23 ⋅ 2

全面理解面向对象的 JavaScript

简介: JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或者只是部分具备一些面向对象的特征。本...

IBMdW ⋅ 2013/04/21 ⋅ 6

Scala极速入门

定义 Scala语言是一种面向对象语言,同时又结合了命令式(imperative)和函数式(functional)编程风格。官网描述:Object-Oriented Meets Functional(面向对象遇到函数式编程)。 安装 下载...

Jackson_Mu ⋅ 2015/01/04 ⋅ 58

Java之类的封装,继承,多态

Java之类的封装,继承,多态 类的封装 将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实 现对内部信息的操作和访问。封装是通过设置访问...

扬名立万 ⋅ 2014/05/14 ⋅ 0

Java对象初始化详解

在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。本文试图对Java如何执行对象的初始化做一个详细深入地介绍(与对象初始化相同,类在被加载之后也是需要初...

cRaZy_JaZa ⋅ 2013/11/19 ⋅ 0

Scala内容总结回顾

Scala内容梳理 变量声明 定义方法和函数 条件控制语句和循环 条件控制语句 for循环 while循环,这种比较少用,一般用于无法判断结束次数的时候。 类的定义 主构造方法: 辅助构造器,重载主构...

刘付kin ⋅ 2016/11/28 ⋅ 0

IoC容器的初始化过程(上)

首先明确以下三点: 下文中的"容器"若无特别,一律指"IoC容器" 严格来说,容器的初始化过程主要包括三个部分: BeanDefinition的Resource定位 BeanDefinition的载入和解析 BeanDefinition在容器中...

芥末无疆sss ⋅ 2017/12/28 ⋅ 0

C++智能指针漫谈【中】

Boost::scoped_ptr Boost::scopedptr是指向自动(栈)对象的、不可复制(noncopyable)的智能指针。Boost::scopedptr模板类存储的是指向动态分配的对象(通过new 分配)的指针。被指向的对象...

开源中国驻成都办事处 ⋅ 2012/09/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

行政区划代码转为字典形式

原数据为: http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/201804-06041553.html 手动替换了一下格式,并使用下面的代码处理. # 输入格式s = """110000:北京市110101:东城区1101...

漫步海边小路 ⋅ 19分钟前 ⋅ 0

android apk 签名

创建key,需要用到keytool.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),使用产生的key对apk签名用到的是jarsigner.exe (位于C:\Program Files\Java\jdk1.6.0_10\bin目录下),把...

国仔饼 ⋅ 28分钟前 ⋅ 0

springcloud+jps+mybatis多数据库配置

多数据库配置 配置我们目录结构设置: config ---datasource ----jpa ----mybatis ----redis Datasource中是数据的相关配置 Jap中是springDatajpa的相关配置 Mybatis中是mybatis的相关配置 ...

大-智-若-愚 ⋅ 35分钟前 ⋅ 0

Spring mvc HandlerMapping 实现机制

概述 当DispatcherServlet接受到客户端的请求后,SpringMVC 通过 HandlerMapping 找到请求的Controller。 HandlerMapping 在这里起到路由的作用,负责找到请求的Controller。 Spring MVC 默认...

轨迹_ ⋅ 38分钟前 ⋅ 0

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部