与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)
}