類是對象的抽象秧秉,而對象是類的具體實(shí)例。類是抽象的衰抑,不占用內(nèi)存象迎,而對象是具體的,占用存儲(chǔ)空間呛踊。類是用于創(chuàng)建對象的藍(lán)圖砾淌,它是一個(gè)定義包括在特定類型的對象中的方法和變量的模板。
1.Scala類的定義和使用
可以使用new關(guān)鍵字創(chuàng)建對象谭网,實(shí)例Test1.scala如下:
class Point(xc:Int,yc:Int){
var x:Int = xc;
var y:Int = yc;
def move(dx:Int, dy:Int){
x = x + dx;
y = y + dy;
println("x = " + x);
println("y = " + y);
}
}
object Test1{
def main(args:Array[String]){
var point = new Point(10,20);
println("point("+point.x+","+point.y+")");
println("move(5,5):");
point.move(5,5);
}
}
編譯并執(zhí)行上述代碼汪厨,輸出結(jié)果如下:
E:\Test>scalac Test1.scala
E:\Test>scala Test1
point(10,20)
move(5,5):
x = 15
y = 25
根據(jù)上述實(shí)例,我們需要注意以下幾點(diǎn):
- Scala的類不聲明為public蜻底,一個(gè)Scala源文件可以有多個(gè)類骄崩;
- Scala的類中可以有成員變量x,y薄辅,也可以有成員方法move要拂;
- Scala的類定義可以有參數(shù)xc,yc站楚,稱為類參數(shù)脱惰,類參數(shù)在整個(gè)類中都可以訪問;
- Scala需要使用一個(gè)類時(shí),使用new關(guān)鍵字生成類對象即可窿春;
- Scala類對象可以調(diào)用自己的成員變量和成員方法拉一。
2.Scala類的繼承
Scala繼承一個(gè)基類跟Java很相似,但是需要注意以下幾點(diǎn):
- 重寫超類的非抽象方法(override修飾的方法)必須使用override修飾符旧乞;
- 重寫超類的抽象方法(沒有override修飾的方法)不需要使用override修飾符蔚润;
- 只有主構(gòu)造函數(shù)才可以往基類的構(gòu)造函數(shù)里寫參數(shù);
下面是一個(gè)Scala繼承的例子:
class Point(val xc:Int, val yc:Int){
var x:Int = xc;
var y:Int = yc;
def move(dx:Int, dy:Int){
x = x + dx;
y = y + dy;
println("x = " + x);
println("y = " + y);
}
}
class Location(override val xc:Int, override val yc:Int, val zc:Int)
extends Point(xc,yc) {
var z:Int = zc;
def move(dx:Int, dy:Int, dz:Int) {
x = x + dx;
y = y + dy;
z = z + dz;
println("x = " + x);
println("y = " + y);
println("z = " + z);
}
}
object Test2{
def main(args:Array[String]) {
var position = new Location(10,20,30);
println("position("+position.x+","+position.y+","+position.z+")");
println("move(1,2,3):");
position.move(1,2,3);
}
}
編譯并執(zhí)行上述代碼尺栖,輸出結(jié)果如下:
E:\Test>scalac Test2.scala
E:\Test>scala Test2
position(10,20,30)
move(1,2,3):
x = 11
y = 22
z = 33
關(guān)于Scala中的繼承嫡纠,有以下幾點(diǎn)需要注意:
- Scala使用extends關(guān)鍵字實(shí)現(xiàn)繼承;
- 被繼承的類叫做基類或父類延赌,繼承的類子類除盏;
- 繼承的類會(huì)獲得父類所有的屬性和方法;
- 繼承的類需要使用override修飾符重寫父類的類變量挫以;
- Scala跟Java一樣者蠕,不允許多繼承,只能繼承一個(gè)父類掐松。
3.Scala重寫父類的非抽象方法
Scala類的方法默認(rèn)都是抽象的踱侣,前面沒有override修飾,Scala重寫一個(gè)抽象方法時(shí)大磺,不需要使用override修飾泻仙,如前面的Test2中的move方法;Scala類的非抽象方法以override修飾量没,Scala重寫一個(gè)非抽象方法時(shí)玉转,也必須使用override修飾,如下面的實(shí)例:
class Person {
var name = "";
override def toString = getClass.getName + "[ name = " + name + " ]";
}
class Employee extends Person {
var salary = 0.0;
override def toString = super.toString + "[ salary = " + salary + " ]";
}
object Test3 extends App {
val fred = new Employee;
fred.name = "Fred";
fred.salary = 50000;
println(fred);
}
編譯并執(zhí)行上述代碼殴蹄,輸出結(jié)果如下:
E:\Test>scalac Test3.scala
E:\Test>scala Test3
Employee[ name = Fred ][ salary = 50000.0 ]
4.Scala單例對象
在Scala中沒有static修飾符究抓,但是Scala可以使用object關(guān)鍵字實(shí)現(xiàn)單例模式。Scala在使用單例模式時(shí)袭灯,除了定義的類之外刺下,還要定義一個(gè)同名的object對象,它和類的區(qū)別是稽荧,object對象不能帶參數(shù)橘茉。當(dāng)單利對象與某個(gè)類共享同一個(gè)名稱時(shí),它被稱為這個(gè)類的伴生對象(companion object);這個(gè)類被稱為該單例對象的伴生類(companion class)畅卓。注意:必須在同一個(gè)源文件里定義類和它的伴生對象擅腰;類和它的伴生對象可以互相訪問私有成員。
下面是一個(gè)單例對象的實(shí)例:
object Test4 {
val str:String = "this is a singleton object";
def main(args:Array[String]){
println(str);
}
}
編譯并執(zhí)行上述代碼翁潘,輸出結(jié)果如下:
E:\Test>scalac Test4.scala
E:\Test>scala Test4
this is a singleton object
下面是一個(gè)伴生對象的實(shí)例:
class Marker private(val color:String){
println("create " + this);
override def toString():String="Color is : "+color;
}
object Marker{
private val markers:Map[String,Marker]=Map(
"red"->new Marker("red"),
"green"->new Marker("green"),
"blue"->new Marker("blue")
);
def apply(color:String)={
if(markers.contains(color))
markers(color);
else
null;
}
def getMarker(color:String)={
if(markers.contains(color))
markers(color);
else
null;
}
def main(args:Array[String]) {
println(Marker("red"));
println(Marker getMarker "blue");
}
}