若是你之前從未使用過面向對象的編程語言,那麼在開始編寫任何代碼以前,你須要學習一些基本概念,本課將向你介紹對象、類、繼承、接口和包,每一個討論都關注這些概念如何與現實世界相關,同時介紹Java編程語言的語法。html
對象是理解面向對象技術的關鍵,環顧四周,你會發現許多現實世界中的東西:你的狗,你的桌子,你的電視機,你的自行車。java
真實世界的對象有兩個特徵:它們都有狀態和行爲,狗有狀態(名字,顏色,品種,飢餓)和行爲(吠叫,挑逗,搖尾巴),自行車也有狀態(當前齒輪,當前踏板節奏,當前速度)和行爲(換檔,改變踏板節奏,踩剎車),識別真實對象的狀態和行爲是開始考慮面向對象編程的好方法。程序員
如今花一分鐘觀察你周圍的真實世界,對於你看到的每個物體,問本身兩個問題:「這個對象可能處於什麼狀態?」和「這個對象可能執行什麼行爲?」,必定要寫下你的觀察結果,正如你所作的,你會注意到現實世界中的對象在複雜性上是不一樣的;你的檯燈可能只有兩個可能的狀態(打開和關閉)和兩個可能的行爲(打開和關閉),可是你的桌面收音機可能有其餘狀態(打開、關閉、當前音量、當前站)和行爲(打開、關閉、增長音量、減小音量、查找、掃描和調優)。你可能還注意到,一些對象反過來也將包含其餘對象,這些實際的觀察結果都轉化爲面向對象編程的世界。編程
軟件對象在概念上與真實世界的對象類似:它們也包括狀態和相關的行爲,對象將其狀態存儲在字段中(某些編程語言中的變量),並經過方法(某些編程語言中的函數)公開其行爲,方法對對象的內部狀態進行操做,並做爲對象到對象通訊的主要機制,隱藏內部狀態並要求經過對象的方法執行全部交互稱爲數據封裝 — 面向對象編程的基本原則。segmentfault
以自行車爲例:api
經過歸因於狀態(當前速度,當前踏板節奏和當前檔位)並提供改變該狀態的方法,該對象仍然控制外部世界如何被容許使用它,例如,若是自行車僅具備6個檔位,則換檔的方法能夠拒絕小於1或大於6的任何值。瀏覽器
將代碼打包到單獨的軟件對象中能夠帶來不少好處,包括:網絡
在現實世界中,你常常會發現許多單獨的物體都是同樣的,可能還有成千上萬的其餘自行車存在,全部的製造和模型都是同樣的,每一輛自行車都是用一樣一套藍圖建造的,所以包含了一樣的部件,在面向對象的術語中,咱們說你的自行車是稱爲自行車的對象類的實例,類是建立單個對象的藍圖。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編程語言的語法對你來講是全新的,可是這個類的設計是基於以前對自行車對象的討論,字段cadence
、speed
以及gear
表示對象的狀態,方法(changeCadence
、changeGear
、speedUp
等)定義了它與外部世界的交互。
你可能已經注意到,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
,speed
和gear
:
cadence:50 speed:10 gear:2 cadence:40 speed:20 gear:3
不一樣種類的物體之間每每有必定的共同之處,例如山地自行車、公路自行車和雙人自行車,都有自行車的特色(目前的速度,目前的踏板節奏,目前的檔位),然而,每一個還定義了使它們不一樣的其餘功能:雙人自行車有兩個座位和兩套車把;公路自行車有彎車把;一些山地自行車有一個額外的鏈環,使它們的齒輪比更低。
面向對象編程容許類從其餘類繼承共同的狀態和行爲,在這個例子中,Bicycle
如今成爲了MountainBike
、RoadBike
和TandemBike
的超類,在Java編程語言中,每一個類都容許有一個直接的超類,每一個超類均可能有無限數量的子類:
建立子類的語法很簡單,在類聲明的開頭,使用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平臺提供的全部包、接口、類、字段和方法的完整清單,在瀏覽器中加載該頁面並將其添加到書籤,做爲程序員,它將成爲你最重要的參考文檔。