1 类的定义
eg. class Point(val x:Int, val y:Int)
(1)首先是关键字
(2)其后是类名Point
(3)类名之后的括号中是构造函数的参数列表,这里相当于定义了对象的两个常量(变量用var定义)。其名称分别为int,类型为Int。
2 Scala对象的构造函数
2.1 只是初始化字段的构造函数
eg. class Point (val x:Int, val y:Int) {
val isOriginal:Boolean = {
x == 0 && y == 0
}
}
上述代码中的isOriginal后面花括号内的内容是构造函数。
2.2 通过this定义的scala构造函数
eg. class Point (val x:Int, val y:Int) {
val isOriginal:Boolean = {
x == 0 && y == 0
}
def this(xArg:Int) {
println("hello, I'm this constructor")
this(xArg,0)
}
}
如上述代码定义了一个只有一个参数的构造函数,这个构造函数调用了默认的构造函数,传了xArg,和0值。这样写的构造函数可以做初始化字段之外的事情。构造函数之间是可以通过this(...)相互调用的。
3 Scala的继承
3.1 extends实现继承
3.2 重写基类的方法
用override关键字来表示重写,这个关键字时必须的,否则编译器会报错。这一点和Java中有所不同。
4特质(Trait)
Scala的特质类似于Java中的接口作用,可以在类或实例中混入(Mixin)这些特质。实际上,特质最终会被编译成Java的接口及相应的实现类。
Scala的特质提供的特性远比Java的接口灵活。trait支持部分实现,也就是说可以在scala中的trait中可以实现部分方法。
(1)Trait和抽象类的区别在于抽象类是对一个继承链的,类和类之前确实有父子类的继承关系,而trait则如其名字,表示一种特征,可以多继承。
(2)用with来继承Trait。
(3)如果Trait中没有抽象方法,显然它是可以实例化的。否则,只能with实现它后,才能实例化。
5 抽象类(abstract)
(1)抽象类最大的特征是不能直接实例化。
(2)用extends继承。
6 伴生对象和伴生类
伴生对象和伴生类在Scala的面向对象编程方法中占据及其重要的位置。例如Scala中许多工具方法都是由伴生对象提供的。
(1)伴生对象首先是一个单例对象,单例对象用关键字object定义。在Scala中,单例对象分为两种,一种是并未自动关联到特定类上的单例对象,称为独立对象(Standalone Object);另一种是关联到一个类上的单例对象,该单例对象与该类共有相同名字,则这种单例对象称为伴生对象(Companion
Object),对应类称为伴生类。
(2)Java中的类,可以既有静态成员,又有实例成员。而在Scala中没有静态成员(静态字段和静态方法),因为静态成员从严格意义而言是破坏面向对象纯洁性的,因此,Scala借助伴生对象来完整支持类一级的属性和操作。伴生类和伴生对象间可以相互访问对方的 private字段和方法。 伴生类Person的构造函数定义为private,虽然这不是必须的,却可以有效防止外部实例化Person类,使得Person类只能供对应伴生对象使用;
(3)每个类都可以有伴生对象,伴生类与伴生对象写在同一个文件中; 在伴生类中,可以访问伴生对象的private字段和方法; 而在伴生对象中,也可以访问伴生类的private字段和方法;
(4)在外部不用实例化,直接通过伴生对象访问内部方法,因为其是静态的。object不能提供构造器参数,也就是说object必须是无参的。 object下的成员都是静态的。