摘要:如果你之前從來沒有使用過面向?qū)ο缶幊陶Z言娇斩,那么在學習Java之前需要先理解幾個有關(guān)面向?qū)ο缶幊痰幕靖拍蠲┲鳌_@篇教程將會向你介紹對象部念、類弃酌、集成、接口和包的概念儡炼,以及這些概念是如何與現(xiàn)實世界相關(guān)聯(lián)妓湘,并介紹這些概念在Java語言中的體現(xiàn)。
??如果你之前從來沒有使用過面向?qū)ο缶幊陶Z言乌询,那么在學習Java之前需要先理解幾個有關(guān)面向?qū)ο缶幊痰幕靖拍畎裉_@篇教程將會向你介紹對象、類妹田、集成唬党、接口和包的概念,以及這些概念是如何與現(xiàn)實世界相關(guān)聯(lián)鬼佣,并介紹這些概念在Java語言中的體現(xiàn)驶拱。
一.對象
??對象將狀態(tài)和行為綁定在一起,它可以被用來模擬你能列舉出的現(xiàn)實世界中的任何實體晶衷。這一小節(jié)將會解釋如何在對象中表示狀態(tài)和行為蓝纲,介紹封裝的概念,并解釋這種軟件設(shè)計方式的好處晌纫。
??對象是理解面向?qū)ο蠹夹g(shù)的關(guān)鍵税迷。環(huán)顧四周,你會發(fā)現(xiàn)許多現(xiàn)實世界中的對象:狗锹漱、桌子箭养、電視機、自行車等×枋撸現(xiàn)實世界中的對象都有兩個特征:它們都有狀態(tài)和行為露懒。狗有自己的狀態(tài)(名字、顏色砂心、品種懈词、是否饑餓等)和行為(叫、跑辩诞、吃等)坎弯。自行車也有狀態(tài)(當前齒輪、當前轉(zhuǎn)速和當前速度等)和行為(換擋、變速和剎車等)抠忘。識別現(xiàn)實對象的狀態(tài)和行為是開始使用面向?qū)ο缶幊谈拍畹暮梅椒ā?br>
??現(xiàn)在花點時間來觀察附近的真實物體撩炊。對于看到的每個對象,請問自己兩個問題:這個對象可能存在哪些狀態(tài)崎脉?這個對象可以執(zhí)行哪些行為拧咳?你會注意到現(xiàn)實世界中的物體的復雜程度各不相同。桌面上的臺燈可能只有兩種狀態(tài)(開和關(guān))和兩種可能的行為(打開和關(guān)閉)囚灼,但電視可能有更多的狀態(tài)(開骆膝,關(guān),當前音量灶体,當前電臺)和更多的行為(打開阅签,關(guān)閉,調(diào)大音量蝎抽,調(diào)小音量政钟,搜索等)。你可能還會注意到樟结,某些對象也會包含其他對象养交。
??編程中的對象在概念上類似于現(xiàn)實世界的對象:它們也包括狀態(tài)和行為。對象將其狀態(tài)存儲在域(編程語言中的變量)中狭吼,并通過方法(編程語言中的函數(shù))公開其行為层坠。方法對對象的內(nèi)部狀態(tài)進行操作,并作為對象和對象通信的主要機制刁笙。隱藏內(nèi)部狀態(tài)并要求通過對象的方法執(zhí)行所有交互稱為封裝破花,這正是面向?qū)ο缶幊痰幕驹瓌t。
??即使對象向外界提供了改變其狀態(tài)的方法疲吸,它仍然控制著外界如何來使用這些方法座每。例如,如果自行車只有6個齒輪摘悴,換檔的方法可以拒絕任何小于1或大于6的值峭梳。
??將代碼與對象綁定有許多好處,包括:
- 模塊化:對象的源代碼可以獨立于其他對象的源代碼進行編寫和維護蹂喻。一旦創(chuàng)建葱椭,對象就可以很容易地在系統(tǒng)內(nèi)部傳遞。
- 信息隱藏:盡管對象通過方法與外界交互口四,但其內(nèi)部實現(xiàn)的細節(jié)仍然對外界隱藏孵运。
- 代碼重用:如果一個對象已經(jīng)存在(可能由另一個軟件開發(fā)人員編寫),那么你可以在程序中使用該對象蔓彩。
- 可插拔和便于調(diào)試:如果某個特定對象出現(xiàn)問題治笨,你可以簡單地將其從應用程序中刪除驳概,并插入另一個對象作為替換對象。這類似于解決現(xiàn)實世界中的機械問題旷赖。如果螺絲壞了顺又,你就換掉它,而不是整臺機器等孵。
二.類
??類是創(chuàng)建對象的藍圖或原型稚照。本節(jié)定義了一個模擬現(xiàn)實世界對象的狀態(tài)和行為的類。我將利用它來展示一個簡單的類如何能夠模擬狀態(tài)和行為俯萌。
??在現(xiàn)實世界中锐锣,經(jīng)常會發(fā)現(xiàn)許多相同類型的對象∩粒可能存在數(shù)千輛自行車,它們都具有相同的品牌和型號姿骏。每輛自行車都是使用相同的原型構(gòu)建的糖声,因此包含相同的組件。在面向?qū)ο蟮男g(shù)語中分瘦,我們將每輛自行車稱為自行車類的一個實例蘸泻。
??下面的Bicycle類是自行車的一種實現(xiàn)方式:
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域表示了對象的狀態(tài),changeCadence去团,changeGear抡诞,speedUp等方法定義了對象與外界的聯(lián)系。
??你可能已經(jīng)注意到Bicycle類不包含main方法土陪,這是因為它不是一個完整的應用程序昼汗。它只是可能在應用程序中使用到的自行車的原型。創(chuàng)建和使用新Bicycle對象的責任屬于應用程序中的其他類鬼雀。
??下面的BicycleDemo類創(chuàng)造了兩個Bicycle對象并調(diào)用了它們的方法:
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();
}
}
??這個樣例的輸出打印了兩輛自行車最終的轉(zhuǎn)速顷窒,速度和檔位:
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3
三.繼承
??繼承為組織和構(gòu)建軟件提供了強大而自然的機制。本節(jié)介紹了類如何從超類繼承狀態(tài)和行為源哩,并解釋了如何使用Java語言提供的語法從一個類派生出另一個類鞋吉。
??有些不同種類的物體具備某些相同的特性。例如励烦,公路自行車和雙人自行車都具有自行車的特性(速度谓着,轉(zhuǎn)速和檔位)。然而崩侠,每種自行車還具有與眾不同的其他功能:雙人自行車有兩個座位和兩套車把漆魔,公路自行車有把手坷檩。
??面向?qū)ο缶幊淘试S類從其他類繼承通用的狀態(tài)和行為。在這個例子中改抡,Bicycle變成了RoadBike和TandemBike的超類矢炼。在Java編程語言中,允許每個類具有一個直接超類阿纤,并且每個超類都有可能存在無限數(shù)量的子類句灌。
??定義子類的語法很簡單。在你要定義的類名后面使用extends關(guān)鍵字欠拾,再跟上要繼承的類的名字:
class MountainBike extends Bicycle {
// new fields and methods defining a mountain bike would go here
}
??MountainBike具有和Bicycle相同的域和方法胰锌,并且允許其代碼專注于獨特的功能,這使得子類的代碼易于閱讀藐窄。但是资昧,必須注意正確記錄每個超類定義的狀態(tài)和行為,因為該代碼不會出現(xiàn)在每個子類的源文件中荆忍。
四.接口
??接口是類與外部世界之間的契約格带。當類實現(xiàn)接口時,它承諾提供由該接口發(fā)布的行為刹枉。本節(jié)定義了一個簡單的接口叽唱,并解釋了任何實現(xiàn)了它的類所需要做的必要的更改。
??正如之前了解的那樣微宝,對象通過它們公開的方法來進行與外部世界的交互棺亭。方法形成對象與外界的接口。例如蟋软,電視機正面的按鈕是你與塑料外殼內(nèi)的電線之間的接口镶摘,你可以使用電源鍵來打開和關(guān)閉電視。
??在最常見的形式中钟鸵,接口是一組沒有方法體的方法钉稍。自行車的行為(如果指定為接口)可能如下所示:
interface Bicycle {
void changeCadence(int newValue);
void changeGear(int newValue);
void speedUp(int increment);
void applyBrakes(int decrement);
}
??要實現(xiàn)這個接口,在你要定義的類名后面使用implements關(guān)鍵字棺耍,再跟上要實現(xiàn)的接口的名字:
class ACMEBicycle implements 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);
}
}
??實現(xiàn)接口就相當于類在履行和接口的承諾贡未。接口形成了類和外部世界之間的契約,而這個契約在編譯時由編譯器進行檢測蒙袍。如果類聲稱要實現(xiàn)一個接口俊卤,那么該類必須提供接口定義的所有方法,然后該類才能成功編譯害幅。
五.包
??包是用于以邏輯方式組織類和接口的命名空間消恍。將代碼放入包中可以使大型軟件項目更易于管理。本節(jié)解釋了這樣做的原因以现,并向您介紹Java平臺提供的應用程序編程接口(API)狠怨。
??包是一個命名空間约啊,用于組織一組相關(guān)的類和接口。從概念上講佣赖,可以將包視為與計算機上的文件夾恰矩。因為用Java編程語言編寫的應用可能由數(shù)百或數(shù)千個單獨的類組成,所以通過將相關(guān)的類和接口放入包中來組織應用的結(jié)構(gòu)是很有意義的憎蛤。
??Java平臺提供了一個很大的類庫(一組包)外傅,該庫稱為“應用程序編程接口”,簡稱“API”俩檬。它代表了最常用于通用編程的任務萎胰。例如,String對象包含字符串的狀態(tài)和行為; 一個File對象允許程序員輕松地創(chuàng)建棚辽、刪除技竟、檢查、比較或修改文件系統(tǒng)上的文件; 一個Socketobject允許創(chuàng)建和使用網(wǎng)絡套接字屈藐。有數(shù)以千計的類可供選擇灵奖。這使程序員可以專注于特定應用程序的設(shè)計,而不是設(shè)計其工作所需的基礎(chǔ)結(jié)構(gòu)估盘。
??在Java Platform API Specification中包含了所有的包,接口骡尽,類的完整列表遣妥。作為程序員,它將成為最重要的參考文檔攀细。