字段、方法和构造函数
scala把主构造函数放在了类定义中。
package com.fanshadoop
class CreditCard(val number:Int, var limit:Int) {
}
实用javap -private CreditCard,可以查看编译器生成的信息:
1)scala会自动把这个类变成public,在scala中没有任何标记为private和protected的数据都默认为public。
2)number声明为val,scala会把它定义为一个private final字段,并创建public的number方法,用以读取值。
3)limit声明为var,scala把它定义为一个private字段,同时提供public的getter和setter方法。
4)如果参数既不是val,又不是var,scala会创建一个private字段和private的getter和setter方法。
5)放在类定义中的任何表达式或可执行语句都最作为主构函数的一部分执行。
6)可以在类定义中,this()就是副构造器。可以在类定义中定义多个字段、0个或多个副构造器。
7)_代表默认值,对于Int就是0,Double就是0.0,对于引用类型就是null
类继承
在Scala中,类继承与Java类似,但多了两个限制:
1)重写方法需要关键字override关键字。
2)只有主构函数才能向基类构造器中传递参数。
package com.fanshadoop
class Vehicle(val id:Int,val year:Int) {
override def toString() : String = {
"id:"+id+"\tyear:"+year
}
}
/**
* 因为car中的id和year源于Vehicle,所以使用了override关键字
*/
class Car(override val id:Int,override val year:Int,val lever:Int)
extends Vehicle(id, year) {
override def toString() : String = {
super.toString() + "\tlever:" + lever
}
}
单例对象
在scala中使用object关键字来创建单例对象。
独立对象和伴生对象
scala中可以创建一个关联到类上的单例。这样的单例同类共享相同的名字,它成为伴生对象,对应的类称为伴生类。类和伴生对象之间没有界限,它们可以相互引用彼此的private字段和private 方法。伴生类和伴生对象写在同一个文件中。
class Marker private (val col:String) {
println("create " + this)
override def toString() : String = {
"make color =" + col
}
}
object Marker {
private val map = Map(
"red" -> new Marker("red"),
"blue" -> new Marker("blue"),
"green" -> new Marker("green"),
"yellow" -> new Marker("yellow")
)
def getMarker(color:String) = {
if (map.contains(color)) map(color) else null
}
}
scala中的static
object Marker {
private val map = Map(
"red" -> new Marker("red"),
"blue" -> new Marker("blue"),
"green" -> new Marker("green"),
"yellow" -> new Marker("yellow")
)
def apply(color:String) = {
if (map.contains(color)) map(color) else null
}
def primaryColors = "red, blue, green, yellow"//相当于静态方法
def main(args:Array[String]) = {
Marker("red")//相当于Marker.apply("red")
}
}