【譯】Java8官方教程:面向對象編程的概念

原文地址:docs.oracle.com/javase/tuto…html

課程:面向對象編程的概念

若是你以前從未使用過面向對象編程語言,在編寫代碼前你將須要學習一些基本的概念。這個課程將介紹對象(Object),類(Class),繼承(inheritance),接口(interface)和包(packages)。討論的重點在於這些概念如何與現實世界相關聯,同時介紹了Java編程語言的語法。java

  • 何爲對象?
  • 何爲類?
  • 何爲繼承?
  • 何爲接口?
  • 何爲包?

何爲對象(Object)?

對象是理解面向對象技術的關鍵。環顧四周,你會發現不少現實世界中的對象:小狗,桌子,電視機,自行車。 現實世界中的對象具備兩個特徵:它們都擁有狀態和行爲。小狗具體狀態(名字,毛色,品種,飢餓情況)和行爲(吠叫,挑逗,搖尾巴)。自行車也擁有狀態(當前的齒輪,當前的踏板節奏、當前的速度)和行爲(換齒輪,剎車,提速)。經過識別真實對象的狀態和行爲來學習面向對象編程不失爲一種很好的方法。
如今就花一分鐘觀察一下你周圍的現實世界,對於你看的到全部對象,問本身兩個問題:這個對象可能處於什麼狀態?這個對象可能執行什麼行爲。必定要寫下你的觀察結果。你會注意到現實世界中的對象是很是複雜的;你的桌燈可能僅有兩種狀態(開和關)和兩種行爲(開燈和關燈),可是你的桌面收音機可能有更多的狀態(開、關、當前音量、當前頻段)和行爲(開機,關機,增大音量,減少音量,調頻等等)。你還可能注意到,有些對象甚至還包含其餘對象。如今將這些現實世界的觀察都轉化爲面向對象編程的世界。程序員

軟件對象在概念上相似於現實世界中的對象:它們都由狀態和相關的行爲組成。一個對象將它自身的狀態存儲在字段(fields)中(在一些語言中稱之爲變量),並經過方法(methods)公開其行爲(一些語言中稱之爲函數)。
方法操做對象的內部狀態,並做爲對象到對象通訊的主要機制。隱藏內部狀態並要求全部交互都經過對象的方法來執行,這就是所謂的數據封裝--面向對象編程的基本原則 舉個關於自行車的例子:

經過指定狀態(當前速度、當前齒輪型號等)並提供更改該狀態的方法,對象仍然控制着外部世界如何使用它。舉個例子:若是自行車僅有6個齒輪,改變齒輪的方法將拒絕任何小於1或者大於6的值。
將代碼捆綁到單個軟件對象中提供了許多好處,其中包括:

  • 模塊性:對象的源代碼能夠獨立於其餘對象的源代碼來編寫和維護,一旦建立了對象,就能夠在系統中輕鬆地傳遞對象
  • 封裝性:經過只與對象的方法交互,其內部實現的細節對外部世界仍然是隱藏的
  • 代碼易複用:若是已經存在一個對象(多是其它開發人員編寫的),則能夠在你本身的程序中使用它。 這容許技術專家實現/測試/調試複雜的、特定任務的對象,而後您能夠信任這些對象在您本身的代碼中運行
  • 插件化並易於調試:若是某個特定對象出現問題,你能夠方便的在應用中移除並用另外的對象來替代。這相似於解決現實世界中的機械問題,若是一個螺栓壞了,你僅須要更換螺栓,而不是整個機器

何爲類(Class)?

在真實世界中,你會發覺許多獨立的對象屬於同一種類。世界上可能還有成千上萬輛自行車,它們的製造工藝和模型都同樣。每輛自行車都是由一套相同的藍圖建造而成,所以包含相同的組件。從面向對象的角度出發:咱們認爲自行車是自行車類的一個實例對象,類是建立單個對象的藍圖。編程

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

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表明對象的狀態,方法(changeCadence, changeGear, speedUp等)定義了它與外部世界的交互。
你可能注意到這個自行車類沒有包含主方法。這是由於這不是一個完整的應用程序。建立和使用新自行車對象的職責屬於應用程序中的其餘類瀏覽器

下面是一個BicycleDemo類,它建立兩個單獨的Bicycle對象並調用它們的方法bash

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:3oracle

何爲繼承?

不一樣的對象每每有相同的組成部分。例如,山地自行車、公路自行車和雙人自行車都具備自行車的特性(當前的速度、當前的踏板節奏、當前的齒輪)。然而各自又擁有不一樣的附加特性:app

  • 雙人自行車有兩個座位和兩組車把
  • 公路自行車有落地式車把
  • 一些山地自行車有一個額外的鏈環,給他們一個較低的傳動比 、

面向對象編程容許類從其餘類繼承通用的狀態和行爲,在這個例子中,自行車成爲了山地車、公路自行車和雙人自行車的父類。在Java編程語言中,全部的類只容許有一個直接父類,而父類能夠有無限的子類:

這個語法建立了一個簡單的子類,在類聲明的開頭,使用extends關鍵字,後面指明要繼承的類的名稱

class MountainBike extends Bicycle {

    // new fields and methods defining 

}
複製代碼

這賦予了山地車與自行車相同的字段和方法,同時容許它的代碼只關注其自身獨一無二的特性。這使得子類更易閱讀。然而,你必須注意在父類中定義的的字段和方法,由於這部分代碼不會出如今子類的源文件中

何爲接口?

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

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

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關鍵字,其中原因會在以後的課程中講述。

何爲包(Package)?

包是一個命名空間,包含一組相關的類和接口。從概念上講,您能夠認爲包相似於計算機上的不一樣文件夾。你可能將HTML頁面放在一個文件夾,圖片放在另一個文件夾,script腳本在另一個。由於Java編程語言編寫的軟件應用可能包含成千上萬個獨立的類,將相關的類和接口放在不一樣的包中是有意義的。

Java平臺提供一個龐大的類庫(一組包)供您在本身的應用中使用,稱之爲API。這些包提供較爲通用的功能,例如:String對象包含字符串的狀態和行爲,File對象容許程序更方便的建立、刪除、查閱、比較或修改文件系統中的文件;Socket對象容許建立一個用於網絡通訊的socket鏈接;不一樣的GUI對象控制按鈕、複選框和任何圖形相關的組件。有成千上萬的類可供選擇。這些保證程序員關注特定應用程序的設計,而不是工做所需的基礎設施

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

相關文章
相關標籤/搜索