Scala的函数式对象

本节主要是通过一个关于有理数的案例来说一些知识点。

包括几大方面:1.类的创建

         2.重载方法

       3.检查先决条件

       4.添加字段

       5.自指向

       6.辅助构造器

       7.私有字段和方法

       8.定义操作符

       9.隐士转换  

先贴个代码哈!!!!!!

object Test{
  def main(args: Array[String]): Unit = {
    val a = new Rational(1,2)
    println(a)

    val b = new Rational(2,3)
    println(b)

    val c = a add b
    println(c)

    println(c.m)
    println(c.n)

    println(c.comp)

    val d = new Rational(4)
    println(d)

    val e = new Rational(66,42)
    println(e)

    val f = new Rational(2,3)
    val g = new Rational(3)
    val h = f + g
    println(h)

    val i = new Rational(2,3)
    val j = new Rational(3,4)
    println(i*j)

    val k = new Rational(2,3)
    val l = new Rational(3,4)
    val m = new Rational(4,5)
    println(k+l*m) //*的优先级比+高,所以先计算l*m,在计算+

    val n = new Rational(2,3)
    val o = new Rational(3)
    val p = n * o
    println(p)

    implicit def intToRational(i:Int):Rational = return new Rational(i)//隐士转换,将整形转换为Rational类型
    val q = new Rational(3,4)
    val r = 2
    println(r*q)

  }
}
//创建Rational类
class Rational(x: Int, y: Int){
  require(y!=0) // 检查先决条件

  def this(cnt:Int) = this(cnt,1) //辅助构造器,可以有多个,定义开始为def this(),
                                  // 被定义的构造器既可以是主构造器,也可以是其他构造器,因此主构造器才是类的唯一入口点

  private val g = gcd(x.abs,y.abs)

  var m = x/g //对外可见的,public,如果没有var或者val修饰词,则是对外不可见的,private
  var n = y/g

  def add(r:Rational):Rational = {
    return new Rational(m*r.n+r.m*n,n*r.n)
  }

  def + (r:Rational):Rational = {
    return new Rational(m*r.n+r.m*n,n*r.n)
  }

  def + (i:Int):Rational = {
    return new Rational(m+i*n,n)
  }

  def - (r:Rational):Rational = {
    return new Rational(m*r.n-r.m*n,n*r.n)
  }

  def - (i:Int):Rational = {
    return new Rational(m-i*n,n)
  }

  def * (r:Rational):Rational = {
    return new Rational(m*r.m,n*r.n)
  }

  def * (i:Int):Rational = {
    return new Rational(m*i,n)
  }

  def / (r:Rational):Rational = {
    return new Rational(m*r.n,n*r.m)
  }

  def / (i:Int):Rational = {
    return new Rational(m,n*i)
  }

  def comp:Int = {if(this.m>this.n) return 1 else 0} // this关键字是自指向,指向的是调用该方法的对象和java的一样

  override def toString = {
    if (n == 1) {
      m+""
    } else {
      m + "/" + n
    } //override修饰符是对原方法的冲载
  }

  //求两个数的最大公约数
  private def gcd(x:Int,y:Int):Int = {
    if(y==0)
      return x
    else{
      return gcd(y,x%y)
    }
  }
}

知识点:

1.当我们重新实现某个函数的时候,比如toString方法,需要使用override关键字。

2.检查先决条件使用require(b:Boolean),参数是一个布尔型参数,当为真的时候继续执行,为假的时候将抛出IllegalArgumentException阻止对象被构造。

3.添加字段,首先确定该字段是否是对外可见,如果对外可见则必须带有val或者var修饰符,默认是public,如果不对外可见,则不需要写修饰符。

4.自指向指的就是this关键字,用法和java的一样,this指向的是调用该函数的对象。

5.有时候某个类可能会需要多个构造器,除了主构造器之外的都是辅助构造器,但是辅助构造器最终还会走到主构造器, 所以主构造器才是类的唯一入口,主构造器内的参数为类参数,类参数对外不可见,辅助构造器固定写法都是以def this(....)定义。

6.在类中也可以定义一些操作符,例如+,-,*,/等。在java或其他语言中,操作符就是一个运算符,但是在scala中,它们是函数。

7.方法重载的定义和java中一样,函数名一样,参数列表不一样,也就是方法签名不一样。

8.隐士转换,这个功能很是强大,但是能力越大,责任越大。我上面的代码都是使用类的对象去调用,但是当我们使用其他类型,例如整型,我们计算1+2/3时,是报错的,但我们使用隐士转换就会把1这个整数转换为我们定义的类型,这样就可以进行其他操作。隐士转换需使用关键字implicit。但是一定要确定好作用域,当超出使用的范围时,不会生效的。

原文地址:https://www.cnblogs.com/lyr999736/p/10504992.html

时间: 2024-08-29 13:55:07

Scala的函数式对象的相关文章

Scala编程--函数式对象

本章的重点在于定义函数式对象,也就是说,没有任何可变状态的对象的类.作为运行的例子,我们将创造若干把分数作为不可变对象建模的类的变体.在这过程中,我们会展示给你Scala面向对象编程的更多方面:类参数和构造函数,方法和操作符,私有成员,子类方法重载,先决条件检查,同类方法重载和自指向. 6.1 类Rational的式样书 一个,或许不怎么重要的,发现是数学上,分数不具有可变的状态.一个分数加到另外一个分数上,产生的结果是一个新的分数.而原来的数不会被“改变”.我们将在本章设计的不可变的Ratio

Programming in Scala (Second Edition) 读书笔记6 函数式对象

1.什么是函数式对象(functional object) ? The emphasis in this chapter is on classes that define functional objects, that is, objects that do not have any mutable state. 状态不可变的对象 2. 对函数式对象的取舍(immutable object trade-offs) Immutable objects offer several advanta

Scala详解---------对象

Scala中的对象 摘要: 在本篇中,你将会学到何时使用Scala的object语法结构.在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,你就会用到它.本篇的要点包括: 1. 用对象作为单例或存放工具方法 2. 类可以拥有-个同名的伴生对象 3. 对象可以扩展类或特质 4. 对象的apply方法通常用来构造伴生类的新实例 5. 如果不想显式定义main方法,可以用扩展App特质的对象 6. 你可以通过扩展Enumeration对象来实现枚举 单例对象 Scala没有静态方

Scala 单例对象

环境: CentOS 6.3, eclipse 单例对象:类是指用class定义的scala 对象,如果用object替换class关键字,那么这个就叫单例对象,sigleton object, 单例对象不可以使用new 关键字生成新的对象实例下面使用三种使用校验和的方式来解释大家的疑问. ChecksumAccumulator.scala //定义class(类) ChecksumAccumulator 和其伴生单例对象(object) ChecksumAccumulator package

Scala类与对象

Scala类与对象 类简介 简介 类是对象的蓝图.一旦你定义了类,就可以用关键字new根据类的蓝图创建对象.在类的定义里,可以放置字段和方法,这些被笼统地称为成员.对于字段,不管是val还是var定义的,都是指向对象的变量.对于方法,用def定义,包含了可执行代码.字段保留了对象的状态或数据,而方法使用这些数据执行对象的运算工作.当类被实例化的时候,运行时环境会预留一些内存来保留对象的状态映像--即变量的内容. 示例 创建类示例: class SumAccumulator { var sum =

聊聊 Scala 的伴生对象及其意义

2019-04-22 关键字:Scala 伴生对象的作用 关于 Scala 伴生对象,比教材更详细的解释. 什么是伴生对象? 教材中关于伴生对象的解释是:实现类似 Java 中那种既有实例成员又有静态成员的类的功能. 为什么上面说它是一种 "功能" 呢?因为要想实现像 Java 中那样的类,光靠一个 Scala 类可不行.在 Scala 中,我们必须: 1. 定义一个 class 并在这里面实现所有的实例成员. 2. 添加一个 object ,这个 object 要与上面的 class

Scala 面向对象编程之对象

此对象非彼java bean对象 是scala object的对象 Object // object,相当于class的单个实例,通常在里面放一些静态的field或者method // 第一次调用object的方法时,就会执行object的constructor,也就是object内部不在method中的代码:但是object不能定义接受参数的constructor // 注意,object的constructor只会在其第一次被调用时执行一次,以后再次调用就不会再次执行constructor了

5.scala中的对象

排版乱?请移步原文获得更好的阅读体验 1.单例对象 scala中没有静态类或者静态方法,都是通过object实现的,它表示某个类的单例对象.如object People是class People的单例对象. 2.伴生对象 java中有些类可能会既有静态方法又有实例方法,在scala中静态方法存在于对象中,也就意味中scala中需要有这么一个东西,它既是类,也含有对象.其中的对象就是类的伴生对象,同样的,类就是对象的伴生类.需要注意的是类和它的伴生对象可以相互访问私有属性,它们也必须存在于同一个源

【Scala】Scala的Predef对象

隐式引用(Implicit Import) Scala会自己主动为每一个程序加上几个隐式引用,就像Java程序会自己主动加上java.lang包一样. Scala中.下面三个包的内容会隐式引用到每一个程序上.所不同的是.Scala还会隐式加进对Predef的引用.这极慷慨便了程序猿的工作. import java.lang._ // in JVM projects, or system namespace in .NET import scala._ // everything in the s