Object-Oriented Programming Concepts——面向對象編程的一些概念

原文鏈接:http://docs.oracle.com/javase/tutorial/java/concepts/index.html

什麼是對象?

    對象是理解面向對象技術的關鍵。現在看看你的周圍你會發現很多現實世界中對象的例子:你的狗,你的桌子,你的電視機,你的自行車。

    現實世界中的對象有兩個特點:他們都有狀態和行爲。狗狗的狀態(名字,顏色,品種,飢餓)和行爲(叫,抓取,搖尾巴)。自行車也有狀態(當前檔位,當前踏板節奏,當前速度)和行爲(改變檔位,改變踏板節奏,剎車)。識別現實世界對象的狀態和行爲是開始面向對象編程思考的好方法。

   現在花一點時間來觀察你周圍的對象。對你看到的每個對象,問自己兩個問題:“這個對象可能有什麼狀態?”和“這個對象可能有什麼行爲”。確認並寫下你的見解。當你這樣做了,你會注意到現實世界中的對象在複雜性上有所不同。你的檯燈可能只有兩種狀態(開和關)和兩種行爲(打開和關閉),但你的收音機可能有其它的狀態(開、關、當前音量、當前頻道)和行爲(打開、關閉、提高音量、降低音量,查找,瀏覽,調)。還可能會注意到,一些對象反過來也將包含其他對象。這些在現實世界中的觀察就可轉化爲面向對象編程的思想。


   軟件對象在概念上類似於現實世界的對象:它們也包括狀態和行爲。一個對象將其狀態存儲在字段中(一些編程語言中的變量)並且通過方法(一些編程語言中的方法)展示其行爲。方法對對象內部狀態進行操作並作爲對象與對象通信的主要機制。隱藏內部狀態並要求通過對象的方法執行所有交互被稱爲數據封裝——面向對象編程的基本原理

   以自行車爲例:


    通過歸納狀態(當前速度,當前踏板速度和當前檔位)和提供改變狀態的方法,對象仍然可以控制外部如何使用它。例如:如果自行車只有6檔,那麼改變齒輪的方法可以拒絕小於1或大於6的任何值。

    將代碼綁定到單個對象有很多好處,包括:

    1.模塊化:對象的源代碼可以獨立於其它對象的源代碼來編寫和維護,一旦創建,可以很方便地被程序擴展。

    2.信息安全:通過與對象的方法進行交互時,它的內部細節仍然對外界隱藏。

    3.代碼重用:如果某個對象已經存在(可能由另一個軟件開發人員編寫),你就可以在你的程序中使用。也可以讓專家實現/測試/調試複雜的特定任務的對象,之後,你也就可以放心的在自己的代碼中使用。

    4.可插拔性和調試簡便:如果一個特定的對象是有問題的,你可以非常容易地從應用程序中刪除它,並替換一個其它的對象。這類似於在現實世界中修復機械問題。如果一個螺絲壞了,更換一個螺絲即可,而不是更換整個機器。

什麼是類?

    現實世界中,你會發現很多單獨的對象具有相同的類型。可能存在成千上萬輛自行車,具有相同的品牌和型號。每輛自行車是由同一套藍圖構成的,因此包含相同的組件。在面向對象術語中,我們會說你的自行車是自行車對象類的一個實例。一個類就是創建單個對象的藍圖

    下面的Bicycle類是一個可行的自行車的實施方案:

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編程語言很陌生,但是類的設計時基於以前對自行車對象的討論。節奏、速度、檔位代表對象的狀態,方法(改變節奏、改變檔位、加速等)定義了對象外界的交互。
    你可能已經注意到,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();
    }
}
    該測試輸出兩輛自行車最終的踏板節奏,速度,和檔位。
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3

什麼是繼承?

    不同類型的對象通常有一定量的重複。例如,山地自行車,公路自行車和雙人自行車都具有自行車的特點(當前速度,當前踏板節奏,當前檔位),當然每個都定義了不同的附加特徵:雙人自行車有兩個座位和兩套車把;公路自行車有低的車把;一些山地自行車有一個額外的鏈環,給他們較低的檔位。

    面向對象編程允許類繼承其它類的常用狀態和方法,在這個例子中。Bicycle現在是MountainBike,RoadBike和TandemBike的父類.在Java編程語言中,每個類允許有一個直接父類,每個父類具有無限的子類。


    創建子類的語法很簡單。在開始聲明類的時候,用extends關鍵字,後面跟着繼承的類的名稱:

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對象允許創建和使用網絡套接字;各種GUI對象控制按鈕和複選框以及與圖形用戶界面相關的內容。有幾千個類可供選擇。這使你、使程序員能更專注於特定應用程序的設計,而不是將精力放在使程序能運行所需的基礎架構上。

   Java Platform API規範包含Java SE平臺提供的所有軟件包,接口,類,字段和方法的完整列表。將頁面加載到瀏覽器並將其加入書籤。作爲程序員,它將成爲您最重要的參考文獻文檔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章