Scala学习笔记(四) ---- 基本类型和操作与函数式对象

一、基本类型与操作

scala的基本类型与java差不多,但两者之间有一些差别,再次就不重点细分来逐个来聊各个基本类型,主要针对scala的不同之处来聊下。

1、首先,我们来看一下下面这张表格,展示的是scala的一些基本类型:

上面表格中,String是java.lang的类型,其他的是scala的成员类型,这点要注意。

基本类型与java的类似,就不详细介绍了,下面来聊一聊操作符与方法:

2、操作符和方法

2.1、indexOf方法:

String提供了两种重载的indexOf方法,分别是带一个参数的和带两个参数的,通过例子来看下:

//带一个参数的indexOf
scala> val str = "Hello,World!"
str: java.lang.String = Hello,World!
scala> str indexOf '0'
res0: Int = 4

//带两个参数的indexOf
scala> str indexOf ('o', 5)
res1: Int = 7


上面例子中,两种indexOf重载的方法,一个参数的与java中的一样,带两个参数的其中第二个参数的意思是从字符串str的第5号索引位置开始往后查找对应的‘o’字符。


3、scala的 "==" 与 java的 "==" 的差别,首先看例子再说明问题:

scala> "he"+"llo" == "hello"
res2: Boolean = true

//java 原始类型比较代码片段
String str1 = "hello";
String str2 = "he" + "llo";
System.out.println(str1 == str2);
//输出结果
true


从上面的类型中,可以看到scala 的== 比较结果与java的原始类型比较的结果相同,对java来说"=="除了原始类型的比较,可以以对参数类型的比较,也就是比较两个变量是否都指向JVM堆里的同一个对象。而这种机制在scala中是通过eq (不相等为 ne)来实现的。


二、函数式对象

1、类参数:在定义类时,类名后面括号内的参数就称为类参数。如下例:

class Rational(n:Int, d:Int) {
    println("Created " +n + "/" + d)
}

上面列子中,类名Rational括号内参数n和d为类参数。


2、重载方法定义,如下:

class Rational(n:Int,d:Int) {
    override def toString = n + "/" + d
}

scala的函数式对象类定义中方法重载是通过关键字override来定义,这和java中@override也一样,就不在过多熬述了。


3、类字段定义,scala在类中定义的方法不能直接通过that.x等来使用类参数,因为方法只能访问这些类参数的值,如果要在定义的方法中使用这些类参数,可以通过字段来使用。下面还是通过一个例子还说明问题:

class Rational(n:Int,d:Int) {
    require(d != 0)    //这个require条件是要求d不能等于0,否则的话就会报错,并不往下执行。
    override def toString = n + "/" + d
    def add(that: Rational): Rational = 
        new Rational(n * that.d + that.n*d, d*that*d)
}

//编译,报如下错
<console>:11: error: value d is not a member of Rational new Rational(n * that.d + that.n * d, d * that.d)

 尽管类参数n和d都在你的add代码可引用的范围内,但是在调用add的对象中仅能访问他们的值,因而不能够通过that.n或that.d来使用,因为that并不指向被调用的Rational对象。如果想要访问that的n和d,可以通过定义字段来实现。

定义字段,实现代码:

class Rational(n:Int,d:Int) {
    require(d != 0)
    val number: Int = n
    val denom: Int = d
    override def toString = number + "/" + denom
    def add(that: Rational): Rational = 
        new Rational(
            number * that.denom + that.number * denom,
            denom * that.denom
        )
}

上面代码,将类参数复制给了字段,然后在类方法中通过使用字段的值就可以实现上面的问题了。


4、从构造器,scala与java一样,可以定义多个构造器,但scala的构造器有它的特点。scala中除除主构造器之外的构造器都称为从构造器,而且这里要特别说明的是,从构造器的第一个动作就是调用同一类的其他构造器,并且是调用位于该构造器定义之前的主构造器或从构造器,所以scala的构造器调用最终都是要调用主构造器

class Rational(n:Int, d:Int) {
    require(d != 0)
    val number : Int = n
    val denom : Int = d
    def this(n: Int) = this(n, 1)   //定义从构造器,并且第一个动作就是调用主构造器this(n, 1)
    override def toString = n + "/" + d
}

5、定义操作符,在上面我们有定义add方法,在调用时,我们可能是如:x add y 这样来调用,这可能与我们平常习惯的不一样,考虑到scala是支持'+','-','*','/'等作为方法名的,那么我们可以将上面定义的方法名改成+,在调用方法时,就直接使用如:x + y 这样来调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值