Java基礎(chǔ)教程(4)--面向?qū)ο蟾拍?/h1>

摘要:如果你之前從來沒有使用過面向?qū)ο缶幊陶Z言娇斩,那么在學習Java之前需要先理解幾個有關(guān)面向?qū)ο缶幊痰幕靖拍蠲┲鳌_@篇教程將會向你介紹對象部念、類弃酌、集成、接口和包的概念儡炼,以及這些概念是如何與現(xiàn)實世界相關(guān)聯(lián)妓湘,并介紹這些概念在Java語言中的體現(xiàn)。

??如果你之前從來沒有使用過面向?qū)ο缶幊陶Z言乌询,那么在學習Java之前需要先理解幾個有關(guān)面向?qū)ο缶幊痰幕靖拍畎裉_@篇教程將會向你介紹對象、類妹田、集成唬党、接口和包的概念,以及這些概念是如何與現(xiàn)實世界相關(guān)聯(lián)鬼佣,并介紹這些概念在Java語言中的體現(xiàn)驶拱。

一.對象

??對象將狀態(tài)和行為綁定在一起,它可以被用來模擬你能列舉出的現(xiàn)實世界中的任何實體晶衷。這一小節(jié)將會解釋如何在對象中表示狀態(tài)和行為蓝纲,介紹封裝的概念,并解釋這種軟件設(shè)計方式的好處晌纫。
??對象是理解面向?qū)ο蠹夹g(shù)的關(guān)鍵税迷。環(huán)顧四周,你會發(fā)現(xiàn)許多現(xiàn)實世界中的對象:狗锹漱、桌子箭养、電視機、自行車等×枋撸現(xiàn)實世界中的對象都有兩個特征:它們都有狀態(tài)和行為露懒。狗有自己的狀態(tài)(名字、顏色砂心、品種懈词、是否饑餓等)和行為(叫、跑辩诞、吃等)坎弯。自行車也有狀態(tài)(當前齒輪、當前轉(zhuǎn)速和當前速度等)和行為(換擋、變速和剎車等)抠忘。識別現(xiàn)實對象的狀態(tài)和行為是開始使用面向?qū)ο缶幊谈拍畹暮梅椒ā?br> ??現(xiàn)在花點時間來觀察附近的真實物體撩炊。對于看到的每個對象,請問自己兩個問題:這個對象可能存在哪些狀態(tài)崎脉?這個對象可以執(zhí)行哪些行為拧咳?你會注意到現(xiàn)實世界中的物體的復雜程度各不相同。桌面上的臺燈可能只有兩種狀態(tài)(開和關(guān))和兩種可能的行為(打開和關(guān)閉)囚灼,但電視可能有更多的狀態(tài)(開骆膝,關(guān),當前音量灶体,當前電臺)和更多的行為(打開阅签,關(guān)閉,調(diào)大音量蝎抽,調(diào)小音量政钟,搜索等)。你可能還會注意到樟结,某些對象也會包含其他對象养交。
??編程中的對象在概念上類似于現(xiàn)實世界的對象:它們也包括狀態(tài)和行為。對象將其狀態(tài)存儲在域(編程語言中的變量)中狭吼,并通過方法(編程語言中的函數(shù))公開其行為层坠。方法對對象的內(nèi)部狀態(tài)進行操作,并作為對象和對象通信的主要機制刁笙。隱藏內(nèi)部狀態(tài)并要求通過對象的方法執(zhí)行所有交互稱為封裝破花,這正是面向?qū)ο缶幊痰幕驹瓌t。
??即使對象向外界提供了改變其狀態(tài)的方法疲吸,它仍然控制著外界如何來使用這些方法座每。例如,如果自行車只有6個齒輪摘悴,換檔的方法可以拒絕任何小于1或大于6的值峭梳。
??將代碼與對象綁定有許多好處,包括:

  • 模塊化:對象的源代碼可以獨立于其他對象的源代碼進行編寫和維護蹂喻。一旦創(chuàng)建葱椭,對象就可以很容易地在系統(tǒng)內(nèi)部傳遞。
  • 信息隱藏:盡管對象通過方法與外界交互口四,但其內(nèi)部實現(xiàn)的細節(jié)仍然對外界隱藏孵运。
  • 代碼重用:如果一個對象已經(jīng)存在(可能由另一個軟件開發(fā)人員編寫),那么你可以在程序中使用該對象蔓彩。
  • 可插拔和便于調(diào)試:如果某個特定對象出現(xiàn)問題治笨,你可以簡單地將其從應用程序中刪除驳概,并插入另一個對象作為替換對象。這類似于解決現(xiàn)實世界中的機械問題旷赖。如果螺絲壞了顺又,你就換掉它,而不是整臺機器等孵。

二.類

??類是創(chuàng)建對象的藍圖或原型稚照。本節(jié)定義了一個模擬現(xiàn)實世界對象的狀態(tài)和行為的類。我將利用它來展示一個簡單的類如何能夠模擬狀態(tài)和行為俯萌。
??在現(xiàn)實世界中锐锣,經(jīng)常會發(fā)現(xiàn)許多相同類型的對象∩粒可能存在數(shù)千輛自行車,它們都具有相同的品牌和型號姿骏。每輛自行車都是使用相同的原型構(gòu)建的糖声,因此包含相同的組件。在面向?qū)ο蟮男g(shù)語中分瘦,我們將每輛自行車稱為自行車類的一個實例蘸泻。
??下面的Bicycle類是自行車的一種實現(xiàn)方式:

class Bicycle {
    int cadence = 0;
    int speed = 0;
    int gear = 1;

    void changeCadence(int newValue) {
        cadence = newValue;
    }

    void changeGear(int newValue) {
        gear = newValue;
    }

    void speedUp(int increment) {
        speed = speed + increment;   
    }

    void applyBrakes(int decrement) {
        speed = speed - decrement;
    }

    void printStates() {
        System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
    }
}

??你可能對Java的語法還不了解,但是這個類的定義是基于我們之前討論的自行車對象的嘲玫。cadence悦施,speed和gear域表示了對象的狀態(tài),changeCadence去团,changeGear抡诞,speedUp等方法定義了對象與外界的聯(lián)系。
??你可能已經(jīng)注意到Bicycle類不包含main方法土陪,這是因為它不是一個完整的應用程序昼汗。它只是可能在應用程序中使用到的自行車的原型。創(chuàng)建和使用新Bicycle對象的責任屬于應用程序中的其他類鬼雀。
??下面的BicycleDemo類創(chuàng)造了兩個Bicycle對象并調(diào)用了它們的方法:

class BicycleDemo {
    public static void main(String[] args) {
        // Create two different Bicycle objects
        Bicycle bike1 = new Bicycle();
        Bicycle bike2 = new Bicycle();
        // Invoke methods on those objects
        bike1.changeCadence(50);
        bike1.speedUp(10);
        bike1.changeGear(2);
        bike1.printStates();

        bike2.changeCadence(50);
        bike2.speedUp(10);
        bike2.changeGear(2);
        bike2.changeCadence(40);
        bike2.speedUp(10);
        bike2.changeGear(3);
        bike2.printStates();
    }
}

??這個樣例的輸出打印了兩輛自行車最終的轉(zhuǎn)速顷窒,速度和檔位:

cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3

三.繼承

??繼承為組織和構(gòu)建軟件提供了強大而自然的機制。本節(jié)介紹了類如何從超類繼承狀態(tài)和行為源哩,并解釋了如何使用Java語言提供的語法從一個類派生出另一個類鞋吉。
??有些不同種類的物體具備某些相同的特性。例如励烦,公路自行車和雙人自行車都具有自行車的特性(速度谓着,轉(zhuǎn)速和檔位)。然而崩侠,每種自行車還具有與眾不同的其他功能:雙人自行車有兩個座位和兩套車把漆魔,公路自行車有把手坷檩。
??面向?qū)ο缶幊淘试S類從其他類繼承通用的狀態(tài)和行為。在這個例子中改抡,Bicycle變成了RoadBike和TandemBike的超類矢炼。在Java編程語言中,允許每個類具有一個直接超類阿纤,并且每個超類都有可能存在無限數(shù)量的子類句灌。
??定義子類的語法很簡單。在你要定義的類名后面使用extends關(guān)鍵字欠拾,再跟上要繼承的類的名字:

class MountainBike extends Bicycle {
    // new fields and methods defining a mountain bike would go here
}

??MountainBike具有和Bicycle相同的域和方法胰锌,并且允許其代碼專注于獨特的功能,這使得子類的代碼易于閱讀藐窄。但是资昧,必須注意正確記錄每個超類定義的狀態(tài)和行為,因為該代碼不會出現(xiàn)在每個子類的源文件中荆忍。

四.接口

??接口是類與外部世界之間的契約格带。當類實現(xiàn)接口時,它承諾提供由該接口發(fā)布的行為刹枉。本節(jié)定義了一個簡單的接口叽唱,并解釋了任何實現(xiàn)了它的類所需要做的必要的更改。
??正如之前了解的那樣微宝,對象通過它們公開的方法來進行與外部世界的交互棺亭。方法形成對象與外界的接口。例如蟋软,電視機正面的按鈕是你與塑料外殼內(nèi)的電線之間的接口镶摘,你可以使用電源鍵來打開和關(guān)閉電視。
??在最常見的形式中钟鸵,接口是一組沒有方法體的方法钉稍。自行車的行為(如果指定為接口)可能如下所示:

interface Bicycle {
    void changeCadence(int newValue);
    void changeGear(int newValue);
    void speedUp(int increment);
    void applyBrakes(int decrement);
}

??要實現(xiàn)這個接口,在你要定義的類名后面使用implements關(guān)鍵字棺耍,再跟上要實現(xiàn)的接口的名字:

class ACMEBicycle implements Bicycle {

    int cadence = 0;
    int speed = 0;
    int gear = 1;

    void changeCadence(int newValue) {
        cadence = newValue;
    }

    void changeGear(int newValue) {
        gear = newValue;
    }

    void speedUp(int increment) {
        speed = speed + increment;   
    }

    void applyBrakes(int decrement) {
        speed = speed - decrement;
    }

    void printStates() {
        System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
    }
}

??實現(xiàn)接口就相當于類在履行和接口的承諾贡未。接口形成了類和外部世界之間的契約,而這個契約在編譯時由編譯器進行檢測蒙袍。如果類聲稱要實現(xiàn)一個接口俊卤,那么該類必須提供接口定義的所有方法,然后該類才能成功編譯害幅。

五.包

??包是用于以邏輯方式組織類和接口的命名空間消恍。將代碼放入包中可以使大型軟件項目更易于管理。本節(jié)解釋了這樣做的原因以现,并向您介紹Java平臺提供的應用程序編程接口(API)狠怨。
??包是一個命名空間约啊,用于組織一組相關(guān)的類和接口。從概念上講佣赖,可以將包視為與計算機上的文件夾恰矩。因為用Java編程語言編寫的應用可能由數(shù)百或數(shù)千個單獨的類組成,所以通過將相關(guān)的類和接口放入包中來組織應用的結(jié)構(gòu)是很有意義的憎蛤。
??Java平臺提供了一個很大的類庫(一組包)外傅,該庫稱為“應用程序編程接口”,簡稱“API”俩檬。它代表了最常用于通用編程的任務萎胰。例如,String對象包含字符串的狀態(tài)和行為; 一個File對象允許程序員輕松地創(chuàng)建棚辽、刪除技竟、檢查、比較或修改文件系統(tǒng)上的文件; 一個Socketobject允許創(chuàng)建和使用網(wǎng)絡套接字屈藐。有數(shù)以千計的類可供選擇灵奖。這使程序員可以專注于特定應用程序的設(shè)計,而不是設(shè)計其工作所需的基礎(chǔ)結(jié)構(gòu)估盘。
??在Java Platform API Specification中包含了所有的包,接口骡尽,類的完整列表遣妥。作為程序員,它將成為最重要的參考文檔攀细。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末箫踩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谭贪,更是在濱河造成了極大的恐慌境钟,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俭识,死亡現(xiàn)場離奇詭異慨削,居然都是意外死亡,警方通過查閱死者的電腦和手機套媚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門缚态,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堤瘤,你說我怎么就攤上這事玫芦。” “怎么了本辐?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵桥帆,是天一觀的道長医增。 經(jīng)常有香客問我,道長老虫,這世上最難降的妖魔是什么叶骨? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮张遭,結(jié)果婚禮上邓萨,老公的妹妹穿的比我還像新娘。我一直安慰自己菊卷,他們只是感情好缔恳,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洁闰,像睡著了一般歉甚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扑眉,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天纸泄,我揣著相機與錄音,去河邊找鬼腰素。 笑死聘裁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的弓千。 我是一名探鬼主播衡便,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洋访!你這毒婦竟也來了镣陕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姻政,失蹤者是張志新(化名)和其女友劉穎呆抑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汁展,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鹊碍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了食绿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹萨。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炫欺,靈堂內(nèi)的尸體忽然破棺而出乎完,到底是詐尸還是另有隱情,我是刑警寧澤品洛,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布树姨,位于F島的核電站摩桶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏帽揪。R本人自食惡果不足惜硝清,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望转晰。 院中可真熱鬧芦拿,春花似錦、人聲如沸查邢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扰藕。三九已至缓苛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邓深,已是汗流浹背未桥。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芥备,地道東北人冬耿。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像萌壳,于是被迫代替她去往敵國和親淆党。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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

  • 寫作與頭腦風暴 今天人挺疲勞的讶凉,就簡單講一點。頭腦風暴山孔。 這個名詞在晨讀里是第二次出現(xiàn)懂讯,重復的力量。不容忽視台颠,我在...
    自律的黃老爺閱讀 354評論 1 7
  • 以為自己會放棄串前,卻沒想到只是藏在心底瘫里。。荡碾。 一直都在問自己谨读,究竟什么是愛情? 看路人來去匆匆坛吁、聚散離合劳殖,我在問铐尚,究...
    橙澈_Cc閱讀 237評論 1 1
  • 我是影子,從被創(chuàng)造的那一刻起就存活于黑暗之中哆姻。 我的名字是1103-1宣增,是1103的復制品。我沒有所謂的童年矛缨,從我...
    碗aki閱讀 175評論 0 0