Class Object: 基础
类、对象、方法
类是对象的蓝图。在类的定义中可以放置字段和方法,称为成员。
字段同时称为实例变量,因为每个类的实例都会有它自己的一组变量。使用val
定义不可变字段,var
来定义可变字段。
不可变是指,一个变量名始终只能引用一个对象,不能再次修改为引用其他的对象。
所有成员默认为public
,使用private
来指定私有成员。
所有方法的参数可以在方法内使用。并且这些参数为val
。方法使用最后一行表达式的值作为返回值,不需要使用return
语句。
分号
在 Scala 中分号通常可以省略,如果一行中有多个语句,仍可以使用它作为分隔。
对于不明显语句,比如:
x
+ y
可以使用小括号将整个语句包围,或者将操作符放在第一行的末尾:
(x
+ y)
x +
y
语句分隔规则:
行尾通常会作为语句的结束,除非它属于以下情况:
- 一行的末尾不是一个合法的单词,如:
.
、中缀操作符等 - 下一行开头的单词不能作为一个合法的语句开始
- 在小括号内或中括号内的行尾,因为这些符号内不能存在多行语句
单例对象
Scala 没有静态成员,但是拥有单例对象。单例对象使用关键字object
定义。并且不能有参数列表,与其类拥有相同的 name,同时二者必须处于同一个文件内。而这个类就称为该半生对象的伴生类。二者可以互相访问对方的私有成员。
一个伴生对象可以作为类似 Java 中放置静态成员的地方。同时他是一个**一类(first-class)**对象。
定义一个单例对象时并不会定义一个类型(type)。比如定义一个TimeUtil
的单例对象并不能创建TimeUtil
类型的变量。名字为TimeUtil
的类型只能通过单例对象的伴生类来定义。
单例对象可以扩展一个超类或超特质,是单例对象成为这些超类、超特质的一个实例。
单例对象会在第一次没访问时进行初始化。
与类不同名的单例对象称为独立对象(standalone object)。可以用来收集公用性质的方法作为 Scala 应用的入口点。
Scala 应用
运行一个 Scala 应用时必须提供一个独立单例对象,包括一个带有单个Array[String]
类型的参数的main
方法,同时返回类型为Unit
。
object Application {
def main(args:Array[String]) = {
// excutable code here
}
}
所有的 Scala 文件都会自动从 scala 包中自动引入
Predef
单例对象,其中包含一些常用的定义,比如常用类型别用、常用隐式转换等。
Scala 中类名不需要与文件名一致。
运行一个 Scala 文件中的应用:
$ scalac ChecksumAccumulator.scala Summer.scala
$ fsc ChecksumAccumulator.scala Summer.scala
App 特质
独立单例对象可以混入一个App
特质,就不需要再编写main
方法,来作为一个程序入口点。
object Application extends App{
// excutable code here
}
不可变对象
使用不可变对象的优势:
- 不可变对象没有会随着时间改变的复杂状态,易于推理。
- 可以将不可变对象自由传递,如果是可变对象则需要对他们进行深拷贝。
- 不会有多个线程并行访问并破会他们最初构造时的状态。
- 不可变对象拥有安全的 Hash 键。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.