1.类、字段和方法:
类定义:
class CheckSumAccumulator {
//这里是类定义
var sum=0
}
就可以如下这样创建CheckSumAccumulator的对象:
new CheckSumAccumulator
实例化对象:
val acc = new CheckSumAccumulator
给sum赋值:
acc.sum=3
要将某个字段声明为私有,可以在字段前加 private 这个访问修饰符,如:
class CheckSumAccumulator {
//这里是类定义
private var sum=0
}
有了 private ,任何试图通过外部访问sum的操作都会失败:
val acc=new CheckSumAccumulator
acc.sum=5//不能编译,因为sum是私有的
注意:在Scala中,使得成员允许公共访问(public)的方式是不在成员前面显式地给出任何修饰符。
由于sum是私有的,唯一能访问sum的代码都定义在类自己里面:
class CheckSumAccumulator {
private var sum=0
def add(b:Byte):Unit={
sum+=b
}
def checkSum():Int={
return ~(sum&0xFF)+1
}
}
Scala方法参数的一个重要特征是它们都是val而不是var。如果对入参重新赋值会报错:
def add(b:Byte):Unit={
b=1 //不能编译,因为b是一个val
sum+=b
}
更精简的CheckSumAccumulator:
class CheckSumAccumulator {
private var sum=0
def add(b:Byte):Unit={sum+=b}
def checkSum():Int= ~(sum&0xFF)+1
}
2.分号推断:在Scala中,每条语句最后的分号通常是可选的。如果同一行包含多条语句,需要分号:
val s = "hello";println(s)
在不该断句的地方断句:
x
+y
这段代码会被解析成两条语句x和+y。希望解析成单条语句x+y,可以包在圆括号里:
(x
+y)
或者也可以将+放在行尾:
x+
y
分号推断的规则:除非以下任意一条符合,否则行尾就会被当作分号处理:
- 当前行以一个不能作为语句结尾的词结尾,比如英文句点或中缀操作符
- 下一行以一个不能作为语句开头的词开头
- 当前行的行尾出现在圆括号(...)或方括号[...]内,因为再怎么说圆括号和方括号也不能(直接)包含多条语句
3.单例对象:
因为Scala不允许有静态(static)成员,Scala提供了单例对象。单例对象的定义看上去和类定义很像,只不过class关键字被换成了object关键字。当单例对象跟某个类共用同一个名字时,它被称作这个类的伴生对象,这个类又叫作这个单例对象的伴生类,但必须在同一个源码文件中定义类和类的伴生对象。类和它的伴生对象可以互相访问对方的私有成员:
class CheakSum {
private val sum=0
def getSum():Int=sum
def prtObject=CheakSum.a
}
object CheakSum {
private val a=3
val dd=new CheakSum
def prtClass= dd.sum
如果你是Java程序员,可以把单例对象当作是用于安置那些用Java时打算编写的静态方法。可以用类似方式访问单例对象的方法:
CheakSum.prtClass
类和单例对象的一个区别是单例对象不接收参数,而类可以。单例对象在有代码首次访问时才被初始化。没有同名的伴生类的单例对象称为 孤立对象(standalone object)。
4.Scala应用程序:要运行一个Scala程序,必须提供一个独立对象的名称。这个独立对象需要包含一个main方法,该方法接收一个Array[String]作为参数,结果类型为Unit。任何带有满足正确签名的main方法的独立对象都能被用作应用程序的入口,如:
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello World!")
}
}
注意:Scala在每一个Scala源码文件都隐式地引入了java.lang和scala包的成员,以及名为Predef的单例对象的所有成员。