Scala学习笔记(三) ---- 类与对象

来源:互联网 发布:windows安装hadoop2.7 编辑:程序博客网 时间:2024/06/06 04:58

与Java一样,Scala类的定义也是通过关键字class来定义的。但首先要说的是,Scala在定义类时该类的文件名不一定非得和类名一样,这个是没有影响的,单在考虑要作为一个Java程序员的习惯,可以在编写类时,将文件名与类名保持一致,这样在查找类时也很方便。

好了,言归正传,首先贴出一个定义类的例子,如下:

class FirstCls {    println("This is a first class.")}//创建、实例化类val myCls = new FirstCls

与Java一样,在类中定义变量或者方法时,可以定义方法或变量的作用域,Scala的默认级别为public。如果想定义成员变量只有在本类中使用,可以使用private来声明为私有的,这个不难理解。

在scala类的方法中,方法的返回值有两种形式:return显示表名返回结果;或不使用return关键字,scala可以将方法中最后一行语句的结果作为返回值类型,如下所示:

class MyCls {    //显示return返回结果    def myMtd1() = {"This has return."}    //不通过return显示返回的    def myMtd2() = {"This has not return."}}

单例对象(Singleton):

Scala可以说是比Java更面向对象的一门语言,在Scala中没有静态成员。作为Java静态成员的替代品---单例对象,可以起着与静态成员类似的作用。在Scala中定义单例对象需要注意的是,通过关键字object来定义,一般来说如果单例对象与类具有相同名称时,这个单例对象就是作为这个类的伴生对象,而这个类则是这个单例对象的伴生类。

现在我们来看一个例子:

//伴生类class MyCls {
    private val name = "Micheal"    def myMtd() = println("This is a something.")}//伴生对象object MyCls {
    def mtd(): String = {
        val cls = new MyCls
        println("name: " + cls.name)
        cls.name
    }}

上面的例子说明了伴生类与伴生对象的定义。同时在伴生对象中,我们调用伴生类的私有成员,如伴生类的私有成员(name)。


在Scala中,你不能通过new关键字来实例化一个单例对象,而且单例对象也是不带参数的。上面我们有说过,单例对象与伴生类名称相同的话,它就是这个类的伴生对象,但也有情况单例对象不与类的名称相同的话,那么这样的单例对象就称之为孤立对象。在Java中我们都通过一个main方法来执行一段程序,Scala也同样可以包含main方法的孤立单例来执行Scala程序。如下面代码所示:

import MyCls.mtd
object MyObj {    def main(args : Array[String]) {        println("name : " + mtd())    }}

上面的例子中,我们引用了MyCls,我们需要将MyCls.scala 与 MyObj.scala都编译然后才能执行main方法,如:

> scalac MyCls.scala MyObj.scala//执行完了之后,会在目录下产生几个编译后的文件,下面就可以执行main方法了。> scala MyObj

上面使用scalac来编译scala源文件,其实Scala还可以通过fsc来快速编译scala源文件,这里就不贴代码了。


Application/App:

首先要说明的,scala 2.9版本后弃用了Application,而启用了App

Scala的单例对象通过extends Application ,然后就可以不用定义main方法来将代码写到单例对象的大括号主体内,这样的写法其实是使用了Application中带有合适的main方法,单例对象继承后,到括号内的代码内容就相当于定义在main方法中一样,所以可以编译并运行。如下面代码:

object myApp extends App {    val cls = new MyCls    println("name->" + cls.name)}


1 0
原创粉丝点击