Java中的封裝和複用__java

來源:互聯網
上載者:User
封裝

在C語言中可以通過結構體封裝多個變數,表示一個事物的多個屬性。而Java是一種物件導向的程式設計語言,它更進一步,將變數和函數封裝在一個類中,使用對象的形式類比一個事物的多個方面,變數對應著對象中的域,表示對象的多個屬性,而函數則對應著對象的方法,類比對象的功能。因此我們可以通過對象域的值表示對象的狀態,對象的方法表示對象所具備的功能,即通過方法向對象傳遞資料並改變它的狀態或者讓其執行某種行為。這是對象對變數和函數的封裝。
從另一個角度講,Java中的類還對實現和介面進行了封裝。一個類封裝了其內部的運行機制,還向外提供一系列介面。類的使用者可以執行個體化該類的對象,並使用這些介面改變對象的狀態或使其執行一些行為,完成一定的功能,亦可以使用該對象組建更為複雜的對象。而類的實現者則負責實現該類的內部運行機制,並向外提供介面,因此這些介面就是使用者與實現者的通訊協定。而在開發過程中,代碼並不是一成不變的,實現者需要不斷更新類的內部運行機制最佳化代碼等,因此需要一種機制將實現與介面分離,避免實現者的改動對使用者的代碼造成影響。所以,Java中使用了private, default, protected, public四種存取權限機制。 1. 程式碼群組織

在介紹Java的存取權限機制之前,需要首先瞭解一下Java的程式碼群組織形式。Java作為物件導向的語言,類是代碼構成的基本單位,但是另外它還有另外兩種層次的基本單位,一個是庫的基本單位:包,即庫可以由多個包組成,另一個是檔案,即一個包可以由多個檔案組成,Java檔案是編譯的基本單位,而一個檔案中可以有多個類,類就是Java代碼的基本構成單位了。Java還規定,每個檔案中最多隻能有一個public類(可以沒有),且該類的名稱應該與檔案名稱一致。編譯之後,每個類(包括內部類)會產生一個位元組碼檔案,即.class檔案,檔案名稱與類名相同,內部類稍有不同。

在Java中使用package關鍵字控制.java檔案和.class檔案的路徑,與類名共同構成該類的全限定名,並且在載入類的時候,通過搜尋classpath+(package控制的該類的路徑)確定該類的.class檔案並載入到虛擬機器。
所以在使用一個類時,需要該類的全限定名才可以在classpath中搜尋到該類對應的.calss檔案並使用,為了減少在代碼編寫的複雜性,Java使用import關鍵字,引入該類,在該檔案的其他地方只需要某類的簡單名稱即可。 2. 存取權限控制

前面說需要將類的實現與介面分離,為了防止實現的改動對使用者代碼的影響,Java中採用了private, default, protected, public四個關鍵字限制類的域和方法的存取範圍。它們依次為類內,包內,繼承結構,全域內的存取範圍,範圍依次擴大,這裡需要注意的的是,protected修飾的域或方法,在包內而不在繼承結構內的也具有存取權限,即protected具有更寬的許可權範圍。
在類的實現過程中,對存取權限控制關鍵詞的使用原則就是使用私人化的關鍵詞控制類的域,即屬性,以及為實作類別的運行機制而需要的方法,使用private將其控制在類的內部使用,也可以使用default(即不加關鍵字)和protected,擴大到包內,繼承結構內使用,將運行機制的代碼控制在一定的使用範圍以內。而對於介面部分,則使用public關鍵字,這部分主要是方法,也是實現者和使用者協商好的使用協議。因此,類的實現與介面就被很好的分離開,實現可以變化,介面則相對固定,避免了改動對使用者的影響。變化部分和不變的部分分離是軟體設計模式的核心思想,Java通過四個存取權限控制關鍵字的機制一定程度上支援了這種思想。

最後需要說明存取權限關鍵字public和default可以修飾class,但是一個檔案中只能有一個public class,而default class 只有在同一個包內的代碼可以使用該類。而private不能修飾類,因為類的外部不能使用該類則沒有任何意義,而protected是為繼承結構設計,對於類同樣沒有任何意義。 代碼複用 1. 複用方式

合理複用已存在的代碼可以很大程度上提升開發效率,複用代碼是Java眾多令人信服的功能之一。首先需要明白,Java中所有的事物都是圍繞類展開,類是一切的基本單元,代碼複用也不例外。代碼複用就可以理解為類的複用,即使用現有的類去構建自己需要的新的類。那麼構建方式就有兩種類型,一種是堆積木方式,就是使用現有類的對象作為新類的域,該對象作為新類的一個屬性,表達它所處的狀態,並利用該對象的功能構建自己需要的功能等,這種方式稱為組合。另一種複用方式就是改造的方式,就在現有類的基礎上對類進行擴充,既保留了原有類的功能,又可以擴充新的功能,這種方式稱為繼承。在兩種方式之間還有一種折中的方式稱為代理,代理構建的新類為代理類,在代理類中包含一個現有類(即被代理類)的對象作為它的屬性,而代理類向外暴露的介面與被代理類的介面一直,而在功能實現方面由代理負責調用被代理類對應方法,即功能由被代理類的對象實現,而代理類的使用者只有對代理類的依賴,不用管具體由誰實現。代理是一種設計模式,可以很好地解耦,這裡只是簡單介紹,個人的一點小小的理解。 2. 基本文法

組合和繼承的文法都比較簡單,這裡需要注意一下對於繼承關係,對象初始化的過程,可以理解為在子類中有一個隱士的父類對象的初始化。另外,對於父類和子類中方法的問題,對於同方法名,涉及到覆寫和重載的概念。對於覆寫是指子類中重新定義了父類中的相同方法,方法名和參數列表完全相同。而重載則是在一個類中相同方法名,不同參數列表,他們是完全不同的方法,只是因為功能相似而取的相同的方法名。而對於父類和子類中相同方法名,不同參數列表的情況,則完全是子類中接介面的擴充,與父類完全沒有關係。為了防止想覆寫父類方法,而方法簽名寫錯而以外擴充介面的狀況,Java中使用@Override註解標明某個方法是對父類的覆寫。如果因為書寫錯誤,而有@Override註解時,會有編譯期的錯誤提醒。此外,重載與傳回型別無關,但是對於覆寫,傳回型別應該一致,或者子類的方法中至少返回父類方法傳回型別或者其匯出類,對於返回匯出類的情況,稱之為協變傳回型別。 3. 方式選擇

組合和繼承的關鍵問題在於如何選擇組合還是繼承。組合技術通常用於想在新類中使用現有類的功能而非它的介面,即新類中嵌入某個對象,讓其實現某個功能,但新類的使用者看到的只是為新類所定義的介面,而非內嵌物件的介面。而繼承是使用現有類並開發一個它的新版本,擴充了它的功能和介面。Java中是使用對象類比現實世界中的事物,而對於組合和繼承的選擇一定程度上取決於事物之間的關係。組合的方式,其對象間的關係為”has-a”,繼承的方式,其對象間的關係為”is-a”。使用組合方式,使得對象間的關係沒有約束,複用類更加靈活,但是缺點是新類是一個全新的類,在外部與現有的類沒有任何關係,無法使用向上轉型,利用多態的優勢。而繼承的方式則是對現有類的擴充,是現有類的一個特殊版本,可以自動向上轉型,可以利用多態的優勢,降低對具體實現的依賴,但是缺點在於現有類與已有類之間的關係約束,使用不再那麼靈活。 final關鍵字

final表示不可變的類型,它可以修飾域,參數,方法和類。 1.final域

final域包括兩種,一是靜態final域,是類的域,屬於編譯期常量,需要在定義時初始化,public修飾的final靜態域,變數名通常大寫,第二種是非靜態final域,即屬於對象的不可變的屬性,這一類要麼在定義時初始化,要麼在構造器中初始化,否則會有編譯期錯誤。 2. final參數

final參數表示在該方法中不能對該對象修改。

注意,final修飾變數,無論是域還是參數,對於基本類型,是其值不能在運行時發生改變,而對於參考型別而言則是指該變數指向的對象不能發生改變,而對象本身的狀態是可以變化的,至於不可變對象的定義Java中沒有提供機制支援。 3. final方法

final方法原本有兩個使用情境,一個是設計目的,避免類的此方法在子類中被覆寫,第二個是最佳化效能,final方法可以自動變為內嵌函式,且不是動態綁定,沒有多態特性,特高運行效率。但是隨著虛擬機器的最佳化機制越來越好,第二個目的已經基本不存在了。因此在考慮是否使用final方法時,只需要考慮這個是不是設計需要。
此外需要注意,private方法預設是final的,子類不能覆寫private方法,因為子類並沒有存取權限。對於定義方法名和參數列表完全與父類相同的情況,則視為定義另外完全沒有關係的方法。 4. final類

final類,很簡單,就是設計目的,即表示這個類不想被使用者擴充,即該類不能被繼承。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.