Scala-隐式转换-私有函数-重载-构造器

package com.zhu.scala

/**
  * Created by zhuhailong-dc on 2017/3/3.
  *
  * Scala编译器将把你放在类内部的任何不是字段的部分或者方法定义的代码,编译进主构造器中
  * 1.先决条件
  * 2.函数重载
  * 3.操作符重载
  * 4.私有函数
  * 5.隐式转换
  */

class Rational(n:Int,d:Int){
  //先决条件使用 require
  require(d!=0)
  require(n!=1)

  //在初始化Rational对象的时候执行
  //println("created "+n+"/"+d)

  //重载toString函数
  override def toString = n+"/"+d

  //添加字段
  val number:Int=n
  val denom:Int=d
  def add(that:Rational):Rational={
    println(n)
    println(d)
    new Rational(number*that.denom+that.number*denom,denom*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里的每一个从构造器的第一个动作都是调用同一个类里面其他的构造器.换句话说就是,每个Scala类里的每个从构造器都是以this(..)
    * 形式开头的.被调用的构造器即可以是主构造器,也可以是从文本上来看早于调用它的其他构造器.这个规则的根本结果就是每一个Scala
    * 的构造器调用终将结束于对类的主构造器的调用.因此主构造器是类的唯一入口点
    */

  def this(n:Int)=this(n,1)

  //私有字段和方法
  private def gcd(a:Int,b:Int):Int=if(b==0) a else gcd(b,a%b)
  private val g=gcd(n.abs,d.abs)

  //定义操作符
  def +(that:Rational):Rational=new Rational(number*that.denom+that.number*denom,denom*that.denom)
  def *(that:Rational):Rational=new Rational(number*that.number,denom*that.denom)

  //scala标识符

  //方法重载
  def +(i:Int):Rational=new Rational(number+i*denom,denom)

}

object Scala_4 {
  def main(args: Array[String]): Unit = {
    val rational=new Rational(2,2) //如果给0会提示 java.lang.IllegalArgumentException: requirement failed
    //println(rational.toString)

    val tmp1=new Rational(2,2)
    val tmp2=new Rational(2,3)
    val res1=tmp1 add tmp2
    val res2=tmp1.add(tmp2)
    val res3=tmp1 add(tmp2)

    //println(res1)
    //println(res2)
    //println(res3)

    val x=new Rational(2,2)
    val y=new Rational(2,3)
    //println(x+y)
    //println(x.+(y))
    //println(x+x*y)

    //隐式转换
    /**
      * 会抛出异常 2没有 * 方法
      * 这行代码定义了从Int到Rational的转换方法,方法前面的implicit修饰符告诉编译器若干情况下自动调用它
      */
    implicit def intToRational(x:Int)=new Rational(x)
    val r=new Rational(2,3)
    println(2*r)

  }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值