糯米文學吧

位置:首頁 > 計算機 > java語言

Java語言面向物件的4大特徵

java語言1.07W

Java是一種面向物件的跨平臺程式設計語言,簡單易用,功能強大。具有簡單性、面向物件、分散式、健壯性、安全性、平臺的獨立與可移植性、多執行緒、動態性等特點,在這篇文章中,我們不討論Java的語言特徵,我們來說說Java面向物件的四大特性:封裝、抽象、繼承和多型。

Java語言面向物件的4大特徵

  封裝

封裝就是將抽象得到的資料和行為(或功能)相結合,形成一個有機的整體,也就是將資料與操作資料的原始碼進行有機的結合,形成“類”,其中資料和函式都是類的成員。

在面嚮物件語言中,封裝特性是由類來體現的,我們將現實生活中的一類實體定義成類,其中包括屬性和行為(在Java中就是方法),就好像人類,可以具有name,sex,age等屬性,同時也具有eat(),sleep()等行為,我們在行為中實現一定的功能,也可操作屬性,這是面向物件的封裝特性.

封裝隱藏了類的內部實現機制,可以在不影響使用的情況下改變類的內部結構,同時也保護了資料。對外界而已它的內部細節是隱藏的,暴露給外界的只是它的訪問方法。封裝的目的是增強安全性和簡化程式設計,使用者不必瞭解具體的實現細節,而只是要通過 外部介面,一特定的訪問許可權來使用類的成員。

封裝是保證軟體部件具有優良的模組性的基礎,封裝的目標就是要實現軟體部件的“高內聚、低耦合”,防止程式相互依賴性而帶來的變動影響。在面向物件的程式語言中,物件是封裝的最基本單位,面向物件的封裝比傳統語言的封裝更為清晰、更為有力。面向物件的封裝就是把描述一個物件的屬性和行為的程式碼封裝在一個“模組”中,也就是一個類中,屬性用變數定義,行為用方法進行定義,方法可以直接訪問同一個物件中的屬性。

通常情況下,只要記住讓變數和訪問這個變數的方法放在一起,將一個類中的成員變數全部定義成私有的,只有這個類自己的方法才可以訪問到這些成員變數,這就基本上實現物件的封裝,就很容易找出要分配到這個類上的方法了,就基本上算是會面向物件的程式設計了。把握一個原則:把對同一事物進行操作的方法和相關的方法放在同一個類中,把方法和它操作的資料放在同一個類中。

例如,人要在黑板上畫圓,這一共涉及三個物件:人、黑板、圓,畫圓的方法要分配給哪個物件呢?由於畫圓需要使用到圓心和半徑,圓心和半徑顯然是圓的屬性,如果將它們在類中定義成了私有的成員變數,那麼,畫圓的方法必須分配給圓,它才能訪問到圓心和半徑這兩個屬性,人以後只是呼叫圓的畫圓方法、表示給圓發給訊息而已,畫圓這個方法不應該分配在人這個物件上,這就是面向物件的封裝性,即將物件封裝成一個高度自治和相對封閉的個體,物件狀態(屬性)由這個物件自己的行為(方法)來讀取和改變。

一個更便於理解的例子就是,司機將火車剎住了,剎車的動作是分配給司機,還是分配給火車,顯然,應該分配給火車,因為司機自身是不可能有那麼大的力氣將一個火車給停下來的,只有火車自己才能完成這一動作,火車需要呼叫內部的離合器和剎車片等多個器件協作才能完成剎車這個動作,司機剎車的過程只是給火車發了一個訊息,通知火車要執行剎車動作而已。

  抽象

抽象就是將一類實體的共同特性抽象出來,封裝在一個抽象類中,所以抽象在面嚮物件語言是由抽象類來體現的。簡單來說,抽象就是找出一些事物的相似和共性之處,然後將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。

例如,看到一隻螞蟻和大象,你能夠想象出它們的`相同之處,那就是抽象。抽象類不能例項化,比如鳥就是一個抽象實體,因為抽象實體並不是一個真正的物件,它的屬性還不能完全描述一個物件,所以在語言中體現為抽象類不能例項化。抽象包括行為抽象和狀態抽象兩個方面。例如,定義一個Person類,如下:

Class Person {

String name;

int age;

}

人本來是很複雜的事物,有很多方面,但因為當前系統只需要瞭解人的姓名和年齡,所以上面定義的類中只包含姓名和年齡這兩個屬性,這就是一種抽像,使用抽象可以避免考慮一些與目標無關的細節。我對抽象的理解就是不要用顯微鏡去看一個事物的所有方面,這樣涉及的內容就太多了,而是要善於劃分問題的邊界,當前系統需要什麼,就只考慮什麼。

  繼承

在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類資料和方法的機制,這是類之間的一種關係,提高了軟體的可重用性和可擴充套件性。

簡單的說,繼承就是在一個現有型別的基礎上,通過增加新的方法或者重定義已有方法的方式,產生一個新的型別。我們在使用JAVA時編寫的每一個類都是在繼承,因為在JAVA語言中,ct類是所有類最根本的基類(或者叫父類、超類),如果我們新定義的一個類沒有明確地指定繼承自哪個基類,那麼JAVA就會預設為它是繼承自Object類的。

  多型

多型是指程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。

因為在程式執行時才確定具體的類,這樣,不用修改源程式程式碼,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式程式碼就可以改變程式執行時所繫結的具體程式碼,讓程式可以選擇多個執行狀態,這就是多型性。多型性增強了軟體的靈活性和擴充套件性。可以說,多型就是通過傳遞給父類物件引用不同的子類物件從而表現出不同的行為,多型可為程式提供更好的可擴充套件性,同樣也可以程式碼重用。

例如,下面程式碼中的UserDao是一個介面,它定義引用變數userDao指向的例項物件由ao()在執行的時候返回,有時候指向的是UserJdbcDao這個實現,有時候指向的是UserHibernateDao這個實現,這樣,不用修改原始碼,就可以改變userDao指向的具體類實現,從而導致()方法呼叫的具體程式碼也隨之改變,即有時候呼叫的是UserJdbcDao的User方法,有時候呼叫的是UserHibernateDao的User方法:

UserDao userDao =ao();

(user);

程式中定義的引用變數所指向的具體型別和通過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改源程式程式碼,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式程式碼就可以改變程式執行時所繫結的具體程式碼,讓程式可以選擇多個執行狀態,這就是多型性。

方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫Overriding是父類與子類之間多型性的一種 表現,過載Overloading是一個類中多型性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被“遮蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。Overloaded的方法是可以改變返回值的型別。方法的重寫Overriding和過載Overloading是Java多型性的不同表現。

以上就是Java語言中面向物件的四大特性:封裝、抽象、繼承和多型,不知道有沒有讓你對Java語言有更深入的認知。