scala学习-介绍scala的几种特性6

原创 2015年11月19日 22:26:42

案例来自于引路蜂
本文介绍完整的定义一个类。定义函数化对象,函数化对象的意思是所定义的类和对象都不包含任何可以修改的状态。还会介绍Scala的几种特性:类参数和构造函数,方法,操作符,私有成员,重载,过载,条件查询,引用自身。
1类定义规范
定义一个有理数的类。有理数的定义:一个有理数可以表示成分数的形式:n/d,其中n和d都是整数,d不能为0。
因此我们定义的个有理数类,Rational类,能支持上面的描述和有理数的操作。有理数的=-*/<,并且可以支持有理数的规范表达,比如2/10,其规范表达是1/5,分子和分母的最小公倍数为1。
我们开始来定义这个类,定义成函数化对象,就说明里面是没有可变的状态的,即是使用immutable方式来定义。我们需要定义分子和分母。

package org.wq.learn
class Rational (n:Int,d:Int)

这和java中定义的类不一样,定义类的时候可以带参数,这个叫做类参数。类参数就是和构造函数一样的功能哈。这样就简化了代码。
Scala编译器会编译任何不属于类成员和类方法的其他代码,因为这些代码将作为类构造函数,比如在下面打印一条语句。

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
}
object Rational extends App{
  new Rational(1,2)
}
结果为:i am a class construction~1/2

可以看见在创建对象的时候,自动执行了主构造函数的代码。
2重定义类的toString方法
当你使用println打印类的时候

 println(new Rational(1,2))
 结果为:org.wq.learn.Rational@74a14482

结果不直观,这是因为,使用了缺省的类作为toString定义(object),缺省打印的是类名+@+16进制对象的地址。所以要重载toString方法。在Scala中,你可以使用override来重载方法,和java一样。override要写在def前面哦。

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
  override def  toString = n+"/"+d
}
object Rational extends App{
 println(new Rational(1,2))
}
结果为:1/2

3前提条件检测
有理数分母步能为0,这里是d不能为0。前面定义,d为0是可以运行的。怎么解决分母不能为0的问题呢。面向对象编程的一个有点是数据的封装。对于一个有理数的前提条件是分母步为0,Scala中定义了为传入构造方法和方法的参数的限制范围,也就是说调用这些函数或者方法需要满足这些条件。Scala中使用了require的方法(require为Predef对象定义的一个方法,Scala环境自动载入这个类的定义,无需import),因此修改代码为:

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
  require(d!=0)
  override def  toString = n+"/"+d
}
object Rational extends App{
 println(new Rational(1,0))
}
结果为:i am a class construction~1/0
Exception in thread "main" java.lang.IllegalArgumentException: requirement failed

如果分母为0,就抛出IllegalArgumentException异常。
今天加班太累,就休息了……
明天继续……

版权声明:本文为博主原创文章,未经博主允许不得转载。

scala学习-介绍scala的几种特性7

承接上篇,前提条件检查,使用require。 1添加成员变量 记得上篇的时候,使用了类参数的方式来构建主构造函数,但是这是由缺陷的。 现在我们构建一个两个rational相加的操作。class ...

scala学习第一弹:基本语法和语法特性

scala很多人都没有听说过,但是spark肯定如雷贯耳了,而spark就是用scala编写的,所以为了更好地了解scala,我们需要学习scala,接下来我将用博客记录我学习scala的全部过程! ...

scala学习笔记6 类

待定

Scala学习笔记6 - 隐式转换和隐式参数

===显式类型转换       正如之前所述的,scala中类型转换使用方法实现,以下是显式类型测试和显式类型转换的示例:                a.isInstanceOf[String] ...

Scala学习笔记6--容器

SetSet是无序容器 定义容器 val feeds1 = Set("blog.toolshed.com", "pragdave.pragprog.com", "pragmactic-osxer.b...

[Scala函数特性系列]——作为值的函数和借贷模式

在scala中,函数是“头等公民”,几乎所有的操作都是以函数形式进行。同样的,能够在变量中存放函数(听上去很神奇吧)。示例如下: 本段代码将ceil函数赋值给fun变量,ceil后面的_表名这是一...

[Scala函数特性系列]——按名称传递参数

通常情况下,函数的参数是传值参数;即参数的值在它被传递给函数之前被确定。但是,如果我们需要编写一个接收参数不希望马上计算,直到调用函数内的表达式才进行真正的计算的函数。对于这种情况,Scala提供按名...

Scala 2.10.0 新特性之使用隐式类进行类型隐式转换

2013-01-19 — Yanbin 在 Scala 2.10.0 之前类型的隐式转换必须通过隐式方法来完成,现在的 Scala 可以用 implicit class 来声明类,并且它的主构...

一步步学spark之一scala高级特性中泛型类与泛型函数3.6

一步步学spark之一scala高级特性中泛型类 泛型类中的泛型是包容具体类型变换的,对这些具体不同的类型,泛型类根据类型进行统一的操作,很多时候泛型类就相当于模板。 泛型定义一个泛型参数 两...

【云星数据---Apache Flink实战系列(精品版)】:Apache Flink高级特性与高级应用021-Flink中OutFormat设置(Scala版)001

一、MultipleTextOutputFormat设置一使用DataSet的key作为文件名称,将DataSet输出到多个文件中。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:scala学习-介绍scala的几种特性6
举报原因:
原因补充:

(最多只允许输入30个字)