原文地址:docs.oracle.com/javase/tuto…html
若是你以前從未使用過面向對象編程語言,在編寫代碼前你將須要學習一些基本的概念。這個課程將介紹對象(Object),類(Class),繼承(inheritance),接口(interface)和包(packages)。討論的重點在於這些概念如何與現實世界相關聯,同時介紹了Java編程語言的語法。java
對象是理解面向對象技術的關鍵。環顧四周,你會發現不少現實世界中的對象:小狗,桌子,電視機,自行車。 現實世界中的對象具備兩個特徵:它們都擁有狀態和行爲。小狗具體狀態(名字,毛色,品種,飢餓情況)和行爲(吠叫,挑逗,搖尾巴)。自行車也擁有狀態(當前的齒輪,當前的踏板節奏、當前的速度)和行爲(換齒輪,剎車,提速)。經過識別真實對象的狀態和行爲來學習面向對象編程不失爲一種很好的方法。
如今就花一分鐘觀察一下你周圍的現實世界,對於你看的到全部對象,問本身兩個問題:這個對象可能處於什麼狀態?這個對象可能執行什麼行爲。必定要寫下你的觀察結果。你會注意到現實世界中的對象是很是複雜的;你的桌燈可能僅有兩種狀態(開和關)和兩種行爲(開燈和關燈),可是你的桌面收音機可能有更多的狀態(開、關、當前音量、當前頻段)和行爲(開機,關機,增大音量,減少音量,調頻等等)。你還可能注意到,有些對象甚至還包含其餘對象。如今將這些現實世界的觀察都轉化爲面向對象編程的世界。程序員
在真實世界中,你會發覺許多獨立的對象屬於同一種類。世界上可能還有成千上萬輛自行車,它們的製造工藝和模型都同樣。每輛自行車都是由一套相同的藍圖建造而成,所以包含相同的組件。從面向對象的角度出發:咱們認爲自行車是自行車類的一個實例對象,類是建立單個對象的藍圖。編程
下面的自行車類是自行車的一種可能實現: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關鍵字,其中原因會在以後的課程中講述。
包是一個命名空間,包含一組相關的類和接口。從概念上講,您能夠認爲包相似於計算機上的不一樣文件夾。你可能將HTML頁面放在一個文件夾,圖片放在另一個文件夾,script腳本在另一個。由於Java編程語言編寫的軟件應用可能包含成千上萬個獨立的類,將相關的類和接口放在不一樣的包中是有意義的。
Java平臺提供一個龐大的類庫(一組包)供您在本身的應用中使用,稱之爲API。這些包提供較爲通用的功能,例如:String對象包含字符串的狀態和行爲,File對象容許程序更方便的建立、刪除、查閱、比較或修改文件系統中的文件;Socket對象容許建立一個用於網絡通訊的socket鏈接;不一樣的GUI對象控制按鈕、複選框和任何圖形相關的組件。有成千上萬的類可供選擇。這些保證程序員關注特定應用程序的設計,而不是工做所需的基礎設施
「Java平臺API規範」包含Java SE平臺提供的全部包、接口、類、字段、方法的完整清單。做爲一個程序員,在瀏覽器中加載該頁面並將其添加書籤,它將成爲您最重要的參考文檔