一、Scala类继承
Scala继承一个基类跟Java很相似,只多了两点限制:1、重写方法需要override关键字,2、只有主构造函数才可以往基类的构造函数里写参数。
Scala的副构造函数必须调用主构造函数或另一个构造函数,在Scala里主构造函数如同一道关卡,类的实例需要通过他来初始化。
示例:
class Vehicle (val id:Int, val year:Int){
override def toString() : String = "ID: " + id + " Year: " + year
def make(name: String) = {
println("Vehicle make name "+ name)
}
}
class Car(override val id: Int, override val year: Int,
var fuelLevel: Int)extends Vehicle(id, year) {
override def toString() : String = super.toString() + " Fuel Level: " + fuelLevel
override def make(name: String) = {
println("Car make name "+ name)
}
}
调用:
val car : Vehicle = new Car(1, 2009, 10)
println(car)
println(car.make("bmw"))
输出:
ID: 1 Year: 2009 Fuel Level: 10
Car make name bmw
二、Scala单例对象
Scala是没有静态对象和属性的,但他拥有伴生对象,
我们利用伴生对象来实现Scala的单例,如:
// 私有构造方法
class Marker private(val color:String) {
println("Creating " + this)
override def toString(): String = "marker color "+ color
}
// 伴生对象,与类共享名字,可以访问类的私有属性和方法
object Marker{
private val markers: Map[String, Marker] = Map(
"red" -> new Marker("red"),
"blue" -> new Marker("blue"),
"green" -> new Marker("green")
)
def apply(color:String) = {
if(markers.contains(color)) markers(color) else null
}
def getMarker(color:String) = {
if(markers.contains(color)) markers(color) else null
}
}
使用:
// 方法糖 apply
println(Marker("red"))
// 单例函数调用,省略了.(点)符号
println(Marker getMarker "blue")
输出:
Creating marker color red
Creating marker color blue
Creating marker color green
marker color red
marker color blue