Scala学习笔记(5)-类和方法

Scala里的类和方法的概念都是差不多的,这里只列出Scala重要的一些概念:

1.Public是Scala的缺省访问级别,可以省略不写。

2.Scala里方法参数的一个重要特征是它们都是val,不是var(参数是val的理由是val更容易讲清楚,你不需要多看代码以确定是否val被重新赋值,而var则不然。)如果你想在方法里面给参数重新赋值,结果是编译失败。

3.如果方法没有发现任何显式的返回语句,Scala将返回方法中最后一个计算得到的值。

4.对于方法来说推荐的风格实际是避免显式的尤其是多个返回语句。代之以把每个方法当作是创建返回值的表达式。这种哲学将鼓励你制造很小的方法,把较大的方法分解为多个更小的方法。另一方面,设计选择取决于设计内容,Scala使得编写具有多个,显式的return的方法变得容易,如果那的确是你期望的。

5.带有大括号但没有等号的,在本质上当作是显式定义结果类型为Unit的方法。

def g() { "this String gets lost too" }

当你去掉方法体前面的等号时,它的结果类型将注定是Unit。不论方法体里面包含什么都不例外,因为Scala编译器可以把任何类型转换为Unit。例如,如果方法的最后结果是String,但方法的结果类型被声明为Unit,那么String将被转变为Unit并失去它的值。

def f(): Unit = "this String gets lost"

6.Singleton对象

Scala比Java更面向对象的一个方面是Scala没有静态成员。替代品是,Scala有单例对象:singleton object。除了用object关键字替换了class关键字以外,单例对象的定义看上去就像是类定义。

就如第一章里的小例子一样:

object Demo {//一个单例对象
 
  def main(args: Array[String]): Unit = { 
    println("hello scala") 
  }
 
}

当单例对象与某个类共享同一个名称时,他被称作是这个类的伴生对象:companion object。你必须在同一个源文件里定义类和它的伴生对象。类被称为是这个单例对象的伴生类:companion class。类和它的伴生对象可以互相访问其私有成员。

类和单例对象间的一个差别是,单例对象不带参数,而类可以。因为你不能用new关键字实例化一个单例对象,你没机会传递给它参数。每个单例对象都被作为由一个静态变量指向的虚构类:synthetic class的一个实例来实现(虚构类的名字是对象名加上一个美元符号。如单例对象ChecksumAccumulator的虚构类是ChecksumAccumulator$),因此它们与Java静态类有着相同的初始化语法。单例对象会在第一次被访问的时候初始化。

不与伴生类共享名称的单例对象被称为孤立对象:standalone object。由于很多种原因你会用到它,包括把相关的功能方法收集在一起,或定义一个Scala应用的入口点。(上面的小例子就是一个孤立对象)

7.Scala隐式引用了包java.lang和scala的成员,和名为Predef的单例对象的成员,到每个Scala源文件中。Predef,被放置在包scala中,包含了许多有用的方法。例如,当在Scala源文件中写pringln的时候,你实际调用了Predef的println。(Predef.pringln运转并调用Console.println,做实际的工作。)当你写assert,你是在调用Predef.assert。

8.Scala里,你可以任意命名.scala文件,而不用考虑里面放了什么Scala类或代码。这点与Java不同,java要求类名与文件名相同。

Scala编译器 scalac xxx.scala

Scala快速编译器 fsc xxx.scala  //第一次执行fsc时,会创建一个绑定在你计算机端口上的本地服务器后台进程。

停止fsc后台进程可执行fsc –shutdown

9.Application特质

Scala提供了一个特质,scala.Application,可以节省你一些手指的输入工作。

使用这个特质的方法是,首先在你的单例对象名后面写上“extends Application” 。然后代之以main方法,你可以把想要放在main方法里的代码直接放在单例对象的大括号之间。就这么简单。之后可以像对其它程序那样编译和运行。

import ChecksumAccumulator.calculate
 
object Demo extends Application {//一个单例对象 
    println("hello scala")
}

这种方式之所以能奏效是因为特质Application声明了带有合适的签名的main方法,并由你的单例对象继承,使它可以像个Scala程序那样用。大括号之间的代码被收集进了单例对象的主构造器:primary constructor,并在类被初始化时被执行。

继承自Application比写个显式的main方法要短,不过它也有些缺点。首先,如果想访问命令行参数的话就不能用它,因为args数组不可访问。第二,因为某些JVM线程模型里的局限,如果你的程序是多线程的就需要显式的main方法。最后,某些JVM的实现没有优化被Application特质执行的对象的初始化代码。因此只有当你的程序相对简单和单线程情况下你才可以继承Application特质。


你可能感兴趣的:(Scala学习笔记(5)-类和方法)