由于学习Spark需要用到Scala,这里简单记录一下Scala的一些基础语法。
1 权限修饰符
如果字段前面什么修饰符都没有就默认是public,外部可以访问该字段。对于类而言,我们并不需要声明为public,Scala文件中包含的多个类之间,都是彼此可见的。
2 方法
2.1 方法定义
def functionName ([参数列表]) : [return type] = {
// 方法主体
}
- 如果你不写等于号和方法主体,那么方法会被隐式声明为抽象(abstract)
- 在Scala中不返回任何值,那么就用Unit表示
- 方法的返回值,不需要靠return语句,方法里面的最后一个表达式的值就是方法的返回值
- 如果大括号里面只有一行语句,那么也可以直接去掉大括号
- 返回值类型和等号也可以省略
- 参数列表中没有参数的话括号也可以省略
2.2 方法调用
- 大体上和java类似
- Scala在调用无参方法时,是可以省略方法名后面的圆括号的。
- a 方法 b 和 a.方法(b)等价
2.3 getter和setter方法
在Scala中,可以通过定义类似getter和setter的方法,分别叫做value
和value_=
代码示例:
class Counter {
private var privateValue = 0 //变成私有字段,并且修改字段名称
def value = privateValue //定义一个方法,方法的名称就是原来我们想要的字段的名称
def value_=(newValue: Int){
if (newValue > 0) privateValue = newValue //只有提供的新值是正数,才允许修改
}
def increment(step: Int): Unit = { value += step}
def current(): Int = {value}
}
value
后面的参数列表、返回值、等于号、方法体的大括号都被省略了
value_=
是函数名,以及value_=
后面的 :unit =
被省略了
2.4 构造器
Scala构造器包含1个主构造器和若干个(0个或多个)辅助构造器。
Scala的主构造器是整个类体,需要在类名称后面罗列出构造器所需的所有参数,这些参数被编译成字段,字段的值就是创建对象时传入的参数的值。
辅助构造器的名称为this,每个辅助构造器都必须调用一个此前已经定义的辅助构造器或主构造器。
3 伴生对象
Scala并没有提供Java那样的静态方法或静态字段,但是,可以采用object关键字实现单例对象,具备和Java静态方法同样的功能。
在Java中,我们经常需要用到同时包含实例方法和静态方法的类,在Scala中可以通过伴生对象来实现。当单例对象与某个类具有相同的名称时,它被称为这个类的“伴生对象”。类和它的伴生对象必须存在于同一个文件中,而且可以相互访问私有成员(字段和方法)。
代码示例:
class Person {
private val id = Person.newPersonId() //调用了伴生对象中的方法
private var name = ""
def this(name: String) {
this()
this.name = name
}
def info() { printf("The id of %s is %d.\n",name,id)}
}
object Person {
private var lastId = 0 //一个人的身份编号
private def newPersonId() = {
lastId +=1
lastId
}
def main(args: Array[String]){
val person1 = new Person("Ziyu")
val person2 = new Person("Minxing")
person1.info()
person2.info()
}
}
运行结果:
The id of Ziyu is 1.
The id of Minxing is 2.
Scala源代码编译后都会变成JVM字节码,实际上,在编译上面的源代码文件以后,在Scala里面的class和object在Java层面都会被合二为一,class里面的成员成了实例成员,object成员成了static成员。
4 继承
Scala中的继承与Java有着显著的不同:
(1)重写一个非抽象方法必须使用override修饰符。
(2)只有主构造器可以调用超类的主构造器。
(3)在子类中重写超类的抽象方法时,不需要使用override关键字。
(4)可以重写超类中的字段,需要使用override关键字。
Scala和Java一样,不允许多继承。
定义抽象类:
(1)定义一个抽象类,需要使用关键字abstract。
(2)定义一个抽象类的抽象方法,不需要关键字abstract,只要把方法体空着,不写方法体就可以。
(3)抽象类中定义的字段,只要没有给出初始化值,就表示是一个抽象字段,但是,抽象字段必须要声明类型
5 特质
在Scala中没有接口的概念,而是提供了“特质(trait)”,它不仅实现了接口的功能,还具备了很多其他的特性。Scala的特质是代码重用的基本单元,可以同时拥有抽象方法和具体方法
。Scala中,一个类只能继承自一个超类,却可以实现多个特质,从而重用特质中的方法和字段,实现了多重继承。
特质定义使用关键字trait
。
特质的抽象方法不需要使用abstract关键字,特质中没有方法体的方法,默认就是抽象方法。
特质定义好以后,就可以使用extends
或with
关键字把特质混入类中。混入多个特质时,使用extends关键字混入第1个特质,后面可以反复使用with关键字混入更多特质。