一、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