美文网首页
Scala学习笔记2——类和对象(一)

Scala学习笔记2——类和对象(一)

作者: 26001a36aa12 | 来源:发表于2016-05-23 15:48 被阅读284次

首先介绍Scala的类定义,我们以一个简单的例子开始,创建一个计算整数累计校验和的类ChecksumAccumulator。

class ChecksumAccumulator{ 
    private var sum=0 
    def add(b:Byte) :Unit = sum +=b 
    def checksum() : Int = ~ (sum & 0xFF) +1
}

可以看到Scala类定义和Java非常类似,也是以class开始,和Java不同的,Scala的缺省修饰符为public,也就是如果不带有访问范围的修饰符public、protected、private等,Scala将默认定义为 public。类的方法以def定义开始,要注意的Scala的方法的参数都是val类型,而不是var类型,因此在函数体内不可以修改参数的值

类的方法分两种,一种是有返回值的,一种是不含返回值的。没有返回值的主要是利用代码的“副作用”,比如修改类的成员变量的值或者读写文件等。Scala内部其实将这种函数的返回值定为Unit(类同Java的void类型),对于这种类型的方法,可以省略掉“=”号,因此如果你希望函数返回某个值,但忘了方法定义中的“=”,Scala会忽略方法的返回值,而返回Unit。

再强调一下,Scala代码无需使用“;”结尾,也不需要使用return返回值,函数的最后一行的值就作为函数的返回值。

但如果你需要在一行中书写多个语句,此时需要使用“;”隔开,不过不建议这么做。你也可以把一条语句分成几行书写,Scala编译器大部分情况下会推算出语句的结尾,不过这样也不是一个好的编码习惯。

对象

Scala比Java更加面向对象,这是因为Scala不允许类保护静态元素(静态变量或静态方法)。在Scala中提供类似功能的是成为“Singleton”(单例对象)”的对象。在Scala中定义Singleton对象的方法使用object,和类定义非常类似。

下面例子创建一个ChecksumAccumulator对象:

object ChecksumAccumulator { 
    private val cache = Map [String, Int] () 
    def calculate(s:String) : Int = 
        if(cache.contains(s)) 
            cache(s) 
        else { 
            val acc=new ChecksumAccumulator 
            for( c <- s) 
                acc.add(c.toByte) 
            val cs=acc.checksum() 
            cache += ( s -> cs) 
            cs 
        }
}

这个对象和上一个创建的类ChecksumAccumulator同名,这在Scala中把这个对象成为其同名的类的“伴侣”对象(Companion object)。 如果你需要定义的类的companion对象,Scala要求你把这两个定义放在同一个文件中。类和其companion对象可以互相访问对方的私有成员。

如果你是Java成员,可以把Singleton对象看成以前Java定义静态成员的地方。你可以使用类似Java静态方法的方式调用Singleton对象的方法,比如下面为这个例子完整的代码:

import scala.collection.mutable.Map
class ChecksumAccumulator{ 
    private var sum=0 
    def add(b:Byte) :Unit = sum +=b 
    def checksum() : Int = ~ (sum & 0xFF) +1
}

object ChecksumAccumulator { 
    private val cache = Map [String, Int] () 
    def calculate(s:String) : Int = 
    if(cache.contains(s)) 
        cache(s) 
    else { 
        val acc=new ChecksumAccumulator 
        for( c <- s) 
            acc.add(c.toByte) 
        val cs=acc.checksum() 
        cache += ( s -> cs) 
        cs 
    }
}

println ( ChecksumAccumulator.calculate("Welcome to Scala Chinese community"))

Scala 的singleton对象不仅限于作为静态对象的容器,它在Scala中也是头等公民,但仅仅定义Singleton对象本身不会创建一个新的类型,你不可以使用new再创建一个新的Singleton对象(这也是Singleton名字的由来),此外和类定义不同的是,singleton对象不可以带参数(类定义参数将在后面的内容中介绍)。

回过头来看看我们的第一个例子“Hello World”。

object HelloWorld { 
    def main(args: Array[String]) { 
        println("Hello, world!") 
    }
}

这是一个最简单的Scala程序,HelloWorld是一个Singleton对象,它包含一个main方法(可以支持命令行参数),和Java类似,Scala中任何Singleton对象,如果包含main方法,都可以作为应用的入口点。

在这里要说明一点的是,在Scala中不要求public类定义和其文件名同名,不过使用和public类和文件同名还是有它的优点的,你可以根据个人喜好决定是否遵循Java文件命名风格。

最后提一下Scala的Trait功能,Scala的Trait和Java 的Interface相比,可以有方法的实现(这点有点抽象类,但如果是抽象类,就不会允许继承多个抽象类)。Scala的Trait支持类和Singleton对象和多个Trait混合(使用来自这些Trait中的方法,而不时不违反单一继承的原则)。Scala为Singleton对象的main定义了一个名为App的 trait类型,因此上面的例子可以简化为:

object HelloWorld extends App{ 
    println("Hello, world!")
}

这段代码就不能作为脚本运行,Scala的脚本要求代码最后以表达式结束。

因此运行这段代码,需要先编译这段代码:

scalac Helloworld.scala

编译好之后,运行该应用:

scala HelloWord

注意: Scala提供了一个快速编译代码的辅助命令fsc(fast scala compliler) ,使用这个命令,只在第一次使用fsc时启动JVM,之后fsc在后台运行,这样就避免每次使用scalac时都要载入相关库文件,从而提高编译速度。

相关文章

  • Scala基础

    学习笔记摘抄于Twitter scala文档:Twitter.github.ionext:Scala类&对象(一)...

  • Scala学习笔记2——类和对象(一)

    类 首先介绍Scala的类定义,我们以一个简单的例子开始,创建一个计算整数累计校验和的类ChecksumAccum...

  • Scala对象和类小结

    该文章是CSDN中Scala对象(Class)和类(Object)学习笔记,方便日后查阅。如要查阅源文档,请点击这...

  • Scala学习笔记4——类和对象(二)

    有理数类的表示 实现规范:支持有理数的加减乘除,并支持有理数的规范表示 1.定义Rational 首先,考虑用户如...

  • Scala语言学习四 (类和对象)

    类和对象 scala是支持面向对象的,也有类和对象的概念。我们依然可以基于scala语言来开发面向对象的应用程序。...

  • Spark常见面试题

    1、scala 语言有什么特点,相比java有什么优点? 2、什么是Scala的伴生类和伴生对象? 3、spark...

  • Scala类和对象

    变量和常量的声明 定义变量或者常量的时候,也可以写上返回的类型,一般省略,如:val a:Int = 10常量不可...

  • Scala类和对象

    类 类是对象的模板,在scala中可以使用new关键字声明同结构的对象class Person { privat...

  • Scala类和对象

    类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图...

  • Scala 类和对象

    如果类没有内容(body),可以省略空的花括号,只写一行语句 类可以带参数,类名称C之后圆括号内的参数,x称为类参...

网友评论

      本文标题:Scala学习笔记2——类和对象(一)

      本文链接:https://www.haomeiwen.com/subject/gcvarttx.html