物件導向 集合 異常面試題

2022-12-28 02:36:02 字數 4800 閱讀 6625

必須掌握:

1. 物件導向的特徵有哪些方面(複習物件導向知識點)

計算機軟體系統是現實生活中的業務在計算機中的對映,而現實生活中的業務其實就是乙個個物件協作的過程。物件導向程式設計就是按現實業務一樣的方式將程式**按乙個個物件進行組織和編寫,讓計算機系統能夠識別和理解用物件方式組織和編寫的程式**,這樣就可以把現實生活中的業務物件對映到計算機系統中。

物件導向的程式語言有4個主要的特徵。

● 封裝:

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

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

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

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

● 抽象:

抽象就是找出一些事物的相似和共性之處,然後將這些事物歸為乙個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。例如,看到乙隻螞蟻和大象,你能夠想象出它們的相同之處,那就是抽象。抽象包括行為抽象和狀態抽象兩個方面。

例如,定義乙個person類,如下:

classperson

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

● 繼承:

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

● 多型:

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

例如,下面**中的userdao是乙個介面,它定義引用變數userdao指向的例項物件由在執行的時候返回,有時候指向的是userjdbcdao這個實現,有時候指向的是userhibernatedao這個實現,這樣,不用修改源**,就可以改變userdao指向的具體類實現,從而導致方法呼叫的具體**也隨之改變,即有時候呼叫的是userjdbcdao的insertuser方法,有時候呼叫的是userhibernatedao的insertuser方法:

userdao userdao =

2. overload和override的區別。overloaded的方法是否可以改變返回值的型別?

overload是過載的意思,override是覆蓋的意思,也就是重寫。

過載overload表示同乙個類中可以有多個名稱相同的方法,但這些方法的引數列表各不相同(即引數個數或型別不同)。

重寫override表示子類中的方法可以與父類中的某個方法的名稱和引數完全相同,通過子類建立的例項物件呼叫這個方法時,將呼叫子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是物件導向程式設計的多型性的一種表現。子類覆蓋父類的方法時,只能比父類丟擲更少的異常,或者是丟擲父類丟擲的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問許可權只能比父類的更大,不能更小。

如果父類的方法是private型別,那麼,子類則不存在覆蓋的限制,相當於子類中增加了乙個全新的方法。

至於overloaded的方法是否可以改變返回值的型別這個問題,要看你倒底想問什麼呢?這個題目很模糊。如果幾個overloaded的方法的引數列表不一樣,它們的返回者型別當然也可以不一樣。

但我估計你想問的問題是:如果兩個方法的引數列表完全一樣,是否可以讓它們的返回值不同來實現過載overload。這是不行的,我們可以用反證法來說明這個問題,因為我們有時候呼叫乙個方法時也可以不定義返回結果變數,即不要關心其返回結果,例如,我們呼叫方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變數,這時候假設該類中有兩個名稱和引數列表完全相同的方法,僅僅是返回型別不同,j**a就無法確定程式設計者倒底是想呼叫哪個方法了,因為它無法通過返回結果型別來判斷。

override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了乙個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了宣告,而我們在實現時,就需要實現介面宣告的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。

在覆蓋要注意以下的幾點:

1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;

2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

3、覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類;

4、被覆蓋的方法不能為private,否則在其子類中只是新定義了乙個方法,並沒有對其進行覆蓋。

overload對我們來說可能比較熟悉,可以翻譯為過載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區分這些方法,然後再呼叫時,vm就會根據不同的引數樣式,來選擇合適的方法執行。在使用過載要注意以下的幾點:

1、在使用過載時只能通過不同的引數樣式。例如,不同的引數型別,不同的引數個數,不同的引數順序(當然,同一方法內的幾個引數型別必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));

2、不能通過訪問許可權、返回型別、丟擲的異常進行過載;

3、方法的異常型別和數目不會對過載造成影響;

4、對於繼承來說,如果某一方法在父類中是訪問許可權是pri**te,那麼就不能在子類對其進行過載,如果定義的話,也只是定義了乙個新方法,而不會達到過載的效果。

3. 抽象類的規則

抽象類內部可以沒有抽象方法

必須用abstract修飾

不能夠直接使用抽象類,必須通過子類繼承並且實現

抽象方法不允許被private修飾

4. 什麼情況下使用抽象類

當乙個類的乙個或多個方法是抽象方法時;

當類是乙個抽象類的子類,並且不能為任何抽象方法提供任何實現細節或方法體時;

當乙個類實現乙個介面,並且不能為任何抽象方法提供實現細節或方法體時;

5. 介面是否可繼承介面?抽象類是否可實現(implements)介面?抽象類是否可繼承具體類(concrete class)?抽象類中是否可以有靜態的main方法?

1. 介面可以繼承介面。抽象類可以實現(implements)介面,抽象類可以繼承具體類。抽象類中可以有靜態的main方法。

2. 備註:只要明白了介面和抽象類的本質和作用,這些問題都很好回答,你想想,如果你是j**a語言的設計者,你是否會提供這樣的支援,如果不提供的話,有什麼理由嗎?

如果你沒有道理不提供,那答案就是肯定的了。

6. abstract class和inte***ce有什麼區別?(複習介面和抽象類)

含有abstract修飾符的class即為抽象類,abstract類不能建立的例項物件。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。

如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract型別。

介面(inte***ce)可以說成是抽象類的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract型別,介面中的成員變數型別預設為public static final。

下面比較一下兩者的語法區別:

1.抽象類可以有構造方法,介面中不能有構造方法。

2.抽象類中可以有普通成員變數,介面中沒有普通成員變數

3.抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。

4. 抽象類中的抽象方法的訪問型別可以是public,protected和(預設型別,雖然eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public型別的,並且預設即為public abstract型別。

C物件導向部分面試題

1.傳入某個屬性的set方法的隱含引數的名稱是什麼?get set value,它的型別和屬性所聲名的型別相同。2.如何在c 中實現繼承?派生類 基類 3.c 支援多重繼承麼?不支援。可以用介面來實現。4.被protected修飾的屬性 方法在何處可以訪問?在繼承或間接繼承於個類的子類中可以訪問。5...

T物件導向程式設計試題

編號 0037 四川廣播電視大學2010年下半年期末考試 物件導向程式設計試題 2011年1月 一 單選題 每小題2分,共12分 1.下面的哪乙個保留字不能作為函式的返回型別?a.void b.int c.new d.long 2.假定a為乙個陣列名,則下面的哪一種表示有錯誤?a.a i b.a c...

物件導向分析與設計考試重點集合

狀態圖通常是對類描述的補充 說明該類的物件所有可能的狀態,以及哪些事件將導致狀態的改變。狀態圖描述了物件的動態行為,是一種物件生存週期的模型。乙個狀態圖包括一系列的狀態以及狀態之間的遷移 狀態圖中定義的狀態有 初態 終態 中間狀態 組合狀態 歷史狀態等 乙個狀態圖只能有乙個初態,而終態可以有多個,也...