Scala編程基礎(chǔ)23:Scala類和對象

類是對象的抽象秧秉,而對象是類的具體實(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");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趁冈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拜马,更是在濱河造成了極大的恐慌渗勘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俩莽,死亡現(xiàn)場離奇詭異旺坠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扮超,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門价淌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞒津,你說我怎么就攤上這事蝉衣。” “怎么了巷蚪?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵病毡,是天一觀的道長。 經(jīng)常有香客問我屁柏,道長啦膜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任淌喻,我火速辦了婚禮僧家,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裸删。我一直安慰自己八拱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布涯塔。 她就那樣靜靜地躺著肌稻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匕荸。 梳的紋絲不亂的頭發(fā)上爹谭,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音榛搔,去河邊找鬼诺凡。 笑死东揣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腹泌。 我是一名探鬼主播嘶卧,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼真屯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起穷娱,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤绑蔫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泵额,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體配深,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嫁盲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篓叶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羞秤,死狀恐怖缸托,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘾蛋,我是刑警寧澤俐镐,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站哺哼,受9級(jí)特大地震影響佩抹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜取董,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一棍苹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茵汰,春花似錦枢里、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至画侣,卻和暖如春冰悠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背配乱。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工溉卓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皮迟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓桑寨,卻偏偏與公主長得像伏尼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子尉尾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容