1. 程式人生 > >java面試準備之面向對象

java面試準備之面向對象

周期 高質量 估計 過程 靈活 rem 共同點 pen 效果

面向對象

下面列出了面向對象軟件開發的優點: (1) 代碼開發模塊化,更易維護和修改。 (2) 代碼復用。 (3) 增強代碼的可靠性和靈活性。 (4) 增加代碼的可理解性。 面向對象編程有很多重要的特性,比如:封裝,繼承,多態和抽象

Java面向對象的三個特征與含義

一、繼承: 1.概念:繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,並能擴展新的能力 2.好處:提高代碼的復用,縮短開發周期。 二、多態: 1.概念:多態(Polymorphism)按字面的意思就是“多種狀態,即同一個實體同時具有多種形式。一般表現形式是程序在運行的過程中,同一種類型在不同的條件下表現不同的結果。多態也稱為動態綁定,一般是在運行時刻才能確定方法的具體執行對象,這個過程也稱為動態委派。 2.好處: 1)將接口和實現分開,改善代碼的組織結構和可讀性,還能創建可拓展的程序。 2)消除類型之間的耦合關系。允許將多個類型視為同一個類型。 3)一個多態方法的調用允許有多種表現形式 三、封裝: 1.概念:就是把對象的屬性和操作(或服務)結合為一個獨立的整體,並盡可能隱藏對象的內部實現細節。 2.好處: (1)隱藏信息,實現細節。讓客戶端程序員無法觸及他們不應該觸及的部分。 (2)允許可設計者可以改變類內部的工作方式而不用擔心會影響到客戶端程序員。

Overload 和 Override

Overload 是重載的意思,Override 是覆蓋的意思,也就是重寫。 重載 Overload 表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。 重寫 Override 表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小

。如果父類的方法是 private 類型,那麽,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。 至於 Overloaded 的方法是否可以改變返回值的類型這個問題,要看你倒底想問什麽呢?這個題目很模糊。如果幾個 Overloaded 的方法的參數列表不一樣,它們的返回者類型當然也可以不一樣。但我估計你想問的問題是:如果兩個方法的參數列表完全一樣,是否可以讓它們的返回值不同來實現重載 Overload。這是不行的,我們可以用反證法來說明這個問題,因為我們有時候調用一個方法時也可以不定義返回結果變量,即不要關心其返回結果,例如,我們調用 map.remove(key) 方法時,雖然 remove 方法有返回值,但是我們通常都不會定義接收返回結果的變量,這時候假設該類中有兩個名稱和參數列表完全相同的方法,僅僅是返回類型不同,Java 就無法確定編程者倒底是想調用哪個方法了,因為它無法通過返回結果類型來判斷。

Override 可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要註意以下的幾點1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果; 2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致,或者是其子類(協變返回類型); 3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類; 4、被覆蓋的方法不能為 private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

Overload 對我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然後再調用時,VM 就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要註意以下的幾點: 1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是 fun(int,float),但是不能 fun(int,int)); 2、不能通過訪問權限、返回類型、拋出的異常進行重載3、方法的異常類型和數目不會對重載造成影響

接口和抽象類的區別

Java 提供和支持創建抽象類和接口。它們的實現有共同點,不同點在於: 1,接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。 2,類可以實現很多個接口,但是只能繼承一個抽象類 3,類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。 4,抽象類可以在不提供接口方法實現的情況下實現接口。 5,Java 接口中聲明的變量默認都是 final 的。抽象類可以包含非 final 的變量。 6,Java 接口中的成員函數默認是 public 的。抽象類的成員函數可以是 private,protected 或者是 public 。 7,接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含 main 方法的話是可以被調用的

接口

接口很重要,為了說明情況,這裏稍微啰嗦點: (1)接口用於描述系統對外提供的所有服務,因此接口中的成員常量和方法都必須是公開(public)類型的,確保外部使用者能訪問它們; (2)接口僅僅描述系統能做什麽,但不指明如何去做,所以接口中的方法都是抽象(abstract)方法; (3)接口不涉及和任何具體實例相關的細節,因此接口沒有構造方法,不能被實例化,沒有實例變量,只有靜態(static)變量; (4)接口的中的變量是所有實現類共有的,既然共有,肯定是不變的東西,因為變化的東西也不能夠算共有。所以變量是不可變(final)類型,也就是常量了。 (5) 接口中不可以定義變量.如果接口可以定義變量,但是接口中的方法又都是抽象的,在接口中無法通過行為來修改屬性。有的人會說了,沒有關系,可以通過 實現接口的對象的行為來修改接口中的屬性。這當然沒有問題,但是考慮這樣的情況。如果接口 A 中有一個public 訪問權限的靜態變量 a。按照 Java 的語義,我們可以不通過實現接口的對象來訪問變量 a,通過 A.a = xxx; 就可以改變接口中的變量 a 的值了。正如抽象類中是可以這樣做的,那麽實現接口 A 的所有對象也都會自動擁有這一改變後的 a 的值了,也就是說一個地方改變了 a,所有這些對象中 a 的值也都跟著變了。這和抽象類有什麽區別呢,怎麽體現接口更高的抽象級別呢,怎麽體現接口提供的統一的協議呢,那還要接口這種抽象來做什麽呢?所以接口中 不能出現變量,如果有變量,就和接口提供的統一的抽象這種思想是抵觸的。所以接口中的屬性必然是常量,只能讀不能改,這樣才能為實現接口的對象提供一個統 一的屬性。 通俗的講,你認為是要變化的東西,就放在你自己的實現中,不能放在接口中去,接口只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴展(不同的實現 implements)開放,接口是對開閉原則的一種體現。 所以:接口的方法默認是 public abstract; 接口中不可以定義變量即只能定義常量(加上final修飾就會變成常量)。所以接口的屬性默認是 public static final 常量,且必須賦初值註意:final 和 abstract 不能同時出現。

兩個對象值相同(x.equals(y) == true),但卻可有不同的 hash code,這句話對不對?

答:不對,如果兩個對象 x 和 y 滿足 x.equals(y) == true,它們的哈希碼(hash code)應當相同。 Java 對於 eqauls 方法和 hashCode 方法是這樣規定的: (1)如果兩個對象相同(equals 方法返回 true ),那麽它們的 hashCode 值一定要相同(2)如果兩個對象的 hashCode 相同,它們並不一定相同。當然,你未必要按照要求去做,但是如果你違背了上述原則就會發現在使用容器時,相同的對象可以出現在 Set 集合中,同時增加新元素的效率會大大下降(對於使用哈希存儲的系統,如果哈希碼頻繁的沖突將會造成存取性能急劇下降)。 (3)如果對象的equals方法的比較操作所用到的信息沒有被修改,那麽對同一個對象調用多次,hashCode方法都必須始終如一地返回同一個整數.

補充:關於 equals 和 hashCode 方法,很多 Java 程序都知道,但很多人也就是僅僅知道而已,在 Joshua Bloch 的大作《Effective Java》(很多軟件公司,《Effective Java》、《Java 編程思想》以及《重構:改善既有代碼質量》是 Java 程序員必看書籍,如果你還沒看過,那就趕緊去亞馬遜買一本吧)中是這樣介紹 equals 方法的:首先 equals 方法必須滿足自反性(x.equals(x) 必須返回true)、對稱性(x.equals(y) 返回true時,y.equals(x) 也必須返回 true)、傳遞性(x.equals(y)和y.equals(z)都返回 true 時,x.equals(z)也必須返回true)和一致性(當x和y引用的對象信息沒有被修改時,多次調用x.equals(y)應該得到同樣的返回值),而且對於任何非 null 值的引用 x,x.equals(null) 必須返回 false。實現高質量的 equals 方法的訣竅包括:

**使用 == 操作符檢查“參數是否為這個對象的引用”**;
**使用 instanceof 操作符檢查“參數是否為正確的類型”**;
**對於類中的關鍵屬性,檢查參數傳入對象的屬性是否與之相匹配**;
**編寫完 equals 方法後,問自己它是否滿足對稱性、傳遞性、一致性**;
**重寫 equals 時總是要重寫 hashCode**;
**不要將 equals 方法參數中的 Object 對象替換為其他的類型,在重寫時不要忘掉 @Override 註解**。

是 AOP 和 OOP,IOC 和 DI

1)面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)是一種計算機編程架構。AOP 是 OOP 的延續,是 Aspect Oriented Programming 的縮寫,意思是面向方面編程。 將通用需求功能從不相關類之中分離出來;同時,能夠使得很多類共享一個行為,一旦行為發生變化,不必修改很多類,只要修改這個行為就可以。AOP 就是這種實現分散關註的編程方法,它將“關註”封裝在“方面”中

2)控制反轉 IOC(Inversion of Control) 控制指的就是程序相關類之間的依賴關系.傳統觀念設計中, 通常由調用者來創建被調用者的實例, 在 Spring 裏,創建被調用者的工作不再由調用者來完成,而是由 Spring 容器完成,依賴關系被反轉了,稱為控制反轉,目的是為了獲得更好的擴展性和良好的可維護性。依賴註入(Dependency injection)創建被調用者的工作由 Spring 容器完成,然後註入調用者,因此也稱依賴註入。控制反轉和依賴註入是同一個概念

java面試準備之面向對象