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

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

1.Public是Scala的缺省访问级别,能够省略不写。数组

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

3.若是方法没有发现任何显式的返回语句,Scala将返回方法中最后一个计算获得的值。多线程

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

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

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

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

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

6.Singleton对象命令行

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

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

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特质。

相关文章
相关标签/搜索