Java™ 教程(面向對象編程概念)

面向對象編程概念

若是你之前從未使用過面向對象的編程語言,那麼在開始編寫任何代碼以前,你須要學習一些基本概念,本課將向你介紹對象、類、繼承、接口和包,每一個討論都關注這些概念如何與現實世界相關,同時介紹Java編程語言的語法。html

什麼是對象?

對象是理解面向對象技術的關鍵,環顧四周,你會發現許多現實世界中的東西:你的狗,你的桌子,你的電視機,你的自行車。java

真實世界的對象有兩個特徵:它們都有狀態和行爲,狗有狀態(名字,顏色,品種,飢餓)和行爲(吠叫,挑逗,搖尾巴),自行車也有狀態(當前齒輪,當前踏板節奏,當前速度)和行爲(換檔,改變踏板節奏,踩剎車),識別真實對象的狀態和行爲是開始考慮面向對象編程的好方法。程序員

如今花一分鐘觀察你周圍的真實世界,對於你看到的每個物體,問本身兩個問題:「這個對象可能處於什麼狀態?」和「這個對象可能執行什麼行爲?」,必定要寫下你的觀察結果,正如你所作的,你會注意到現實世界中的對象在複雜性上是不一樣的;你的檯燈可能只有兩個可能的狀態(打開和關閉)和兩個可能的行爲(打開和關閉),可是你的桌面收音機可能有其餘狀態(打開、關閉、當前音量、當前站)和行爲(打開、關閉、增長音量、減小音量、查找、掃描和調優)。你可能還注意到,一些對象反過來也將包含其餘對象,這些實際的觀察結果都轉化爲面向對象編程的世界。編程

concepts-object.gif

軟件對象在概念上與真實世界的對象類似:它們也包括狀態和相關的行爲,對象將其狀態存儲在字段中(某些編程語言中的變量),並經過方法(某些編程語言中的函數)公開其行爲,方法對對象的內部狀態進行操做,並做爲對象到對象通訊的主要機制,隱藏內部狀態並要求經過對象的方法執行全部交互稱爲數據封裝 — 面向對象編程的基本原則。segmentfault

以自行車爲例:api

concepts-bicycleObject.gif

經過歸因於狀態(當前速度,當前踏板節奏和當前檔位)並提供改變該狀態的方法,該對象仍然控制外部世界如何被容許使用它,例如,若是自行車僅具備6個檔位,則換檔的方法能夠拒絕小於1或大於6的任何值。瀏覽器

將代碼打包到單獨的軟件對象中能夠帶來不少好處,包括:網絡

  1. 模塊化:對象的源代碼能夠獨立於其餘對象的源代碼編寫和維護,一旦建立,對象能夠很容易地在系統內部傳遞。
  2. 信息隱藏:經過只與對象的方法交互,其內部實現的細節仍然隱藏在外部世界以外。
  3. 代碼重用:若是一個對象已經存在(可能由另外一個軟件開發人員編寫),你能夠在程序中使用該對象,這容許專門實現/測試/調試複雜的、特定於任務的對象,而後你能夠信任這些對象在你本身的代碼中運行。
  4. 可插入性和調試方便:若是某個特定對象出現問題,你能夠簡單地從應用程序中刪除它,並將另外一個對象插入替換,這相似於在現實世界中解決機械問題,若是螺栓斷裂,你要更換它,而不是整個機器。

什麼是類?

在現實世界中,你常常會發現許多單獨的物體都是同樣的,可能還有成千上萬的其餘自行車存在,全部的製造和模型都是同樣的,每一輛自行車都是用一樣一套藍圖建造的,所以包含了一樣的部件,在面向對象的術語中,咱們說你的自行車是稱爲自行車的對象類的實例,類是建立單個對象的藍圖。oracle

下面的Bicycle類是自行車的一種可能實現:app

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編程語言的語法對你來講是全新的,可是這個類的設計是基於以前對自行車對象的討論,字段cadencespeed以及gear表示對象的狀態,方法(changeCadencechangeGearspeedUp等)定義了它與外部世界的交互。

你可能已經注意到,Bicycle類不包含main方法,那是由於它不是一個完整的應用程序;這只是在應用程序中使用的自行車的藍圖,建立和使用新的Bicycle對象的職責屬於應用程序中的其餘類。

這裏有一個BicycleDemo類,它建立兩個獨立的Bicycle對象並調用它們的方法:

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();
    }
}

此測試的輸出打印兩輛自行車的cadencespeedgear

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

什麼是繼承?

不一樣種類的物體之間每每有必定的共同之處,例如山地自行車、公路自行車和雙人自行車,都有自行車的特色(目前的速度,目前的踏板節奏,目前的檔位),然而,每一個還定義了使它們不一樣的其餘功能:雙人自行車有兩個座位和兩套車把;公路自行車有彎車把;一些山地自行車有一個額外的鏈環,使它們的齒輪比更低。

面向對象編程容許類從其餘類繼承共同的狀態和行爲,在這個例子中,Bicycle如今成爲了MountainBikeRoadBikeTandemBike的超類,在Java編程語言中,每一個類都容許有一個直接的超類,每一個超類均可能有無限數量的子類:

concepts-bikeHierarchy.gif

建立子類的語法很簡單,在類聲明的開頭,使用extend關鍵字,後跟要繼承的類的名稱:

class MountainBike extends Bicycle {

    // new fields and methods defining 
    // a mountain bike would go here

}

這使MountainBike擁有與Bicycle相同的字段和方法,但它的代碼卻只關注使它獨一無二的特性,這使得子類的代碼易於閱讀,可是,莫必須注意正確記錄每一個超類定義的狀態和行爲,由於該代碼不會出如今每一個子類的源文件中。

什麼是接口?

正如你已經瞭解的,對象經過它們公開的方法定義它們與外部世界的交互,方法造成對象與外界的接口;例如,電視機前的按鈕是你和塑料外殼另外一面的電線之間的接口,你按下「電源」按鈕,打開和關閉電視。

在最多見的形式中,接口是一組具備空體的相關方法,自行車的行爲(若是指定爲接口)可能以下所示:

interface Bicycle {

    //  wheel revolutions per minute
    void changeCadence(int newValue);

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);
}

要實現這個接口,你的類的名稱將會改變(例如,對特定品牌的自行車,例如ACMEBicycle),而且你將在類聲明中使用implements關鍵字:

class ACMEBicycle implements Bicycle {

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

   // The compiler will now require that methods
   // changeCadence, changeGear, speedUp, and applyBrakes
   // all be implemented. Compilation will fail if those
   // methods are missing from this class.

    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);
    }
}

實現接口容許類對其承諾提供的行爲變得更加正式,接口在類和外部世界之間造成契約,而且該契約在構建時由編譯器強制執行,若是你的類聲稱實現了一個接口,那麼在該類成功編譯以前,該接口定義的全部方法必須出如今其源代碼中。

要實際編譯 ACMEBicycle類,你須要將 public關鍵字添加到已實現的接口方法的開頭,稍後你將在有關類和對象以及接口和繼承的課程中瞭解相關緣由。

什麼是包?

包是組織一組相關類和接口的命名空間,從概念上來講,你能夠將包看做相似於計算機上的不一樣文件夾,你能夠將HTML頁面保存在一個文件夾中,將圖像保存在另外一個文件夾中,將腳本或應用程序保存在另外一個文件夾中。由於用Java編程語言編寫的軟件能夠由數百或數千個單獨的類組成,因此經過將相關的類和接口放置到包中來組織事情是有意義的。

Java平臺提供了一個龐大的類庫(一組包),能夠在你本身的應用程序中使用,這個庫被稱爲「應用程序編程接口」,簡稱爲「API」,它的包表明了最經常使用於通用編程的工做。例如,String對象包含字符串的狀態和行爲;File對象容許程序員輕鬆地在文件系統上建立、刪除、檢查、比較或修改文件;Socket對象容許建立和使用網絡sockets;各類GUI對象控制按鈕和複選框以及與圖形用戶界面相關的任何其餘內容。實際上有成千上萬個類可供選擇,這容許程序員關注特定應用程序的設計,而不是使其工做所需的基礎設施。

Java平臺API規範包含Java SE平臺提供的全部包、接口、類、字段和方法的完整清單,在瀏覽器中加載該頁面並將其添加到書籤,做爲程序員,它將成爲你最重要的參考文檔。


上一篇:常見問題(及其解決方案)

下一篇:變量

相關文章
相關標籤/搜索