轉載:JAVA企業面試題精選 OOP 1-10
2.OOP
2.1.什麼是OOAD?OOAD怎麼實現?
參考答案:
OOAD(Object Orient Analysis Design,面向物件的分析與設計)是現代軟體企業廣為採用的一項有效技術。OOAD方法要求在設計中腰對映現實世界中指定問題域中的物件和實體,例如:顧客、汽車和銷售人員等。這就需要設計腰儘可能地接近現實世界,即以最自然的方式表述實體。 使用UML建模語言建立系統的分析模型與設計模型是OOAD實現的主要手段。
2.2.請分述類及物件的建立模式
參考答案:
總共有五種建立模式,分別是單例模式,工廠方法模式,抽象工廠模式,創造者模式,原型模式,其中工廠方法模式是類建立模式,其餘四種是物件建立模式。下面是對各個模式的介紹。 單例模式(Singleton,物件建立模式):單例模式確保其一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 工廠方法模式(Factory Method,類建立模式):核心工廠類不再負責所有產品的建立,而是將具體建立的工作交給子類去做,成為一個抽象工廠角色,僅負責給出具體工廠類必須實現的介面,而不接觸哪一個產品類應當被例項化這種細節。 抽象工廠模式(Abstract Factory,物件建立模式):抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,建立多個產品族中的產品物件。簡單來說是建立一組相關或相互依賴的複雜物件。 建造模式(Builder,物件建立模式):將產品的內部表象和產品的生成過程分割開來,從而使一個建造過程生成具有不同的內部表象的產品物件。建造模式使得產品內部表象可以獨立的變化,客戶不必知道產品內部組成的細節。建造模式可以強制實行一種分步驟進行的建造過程。 原型模式(Prototype,物件建立模式):通過給出一個原型物件來指名所要建立的物件型別,然後用複製這個原型物件的方法創建出更多同類型的物件。原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事先確定的等級結構,原始模型模式適用於任何的等級結構。缺點是每一個類都必須配備一個克隆方法。
2.3.什麼時候需要改寫hashCode方法?為什麼?
參考答案:
在改寫equals方法的時候總是要改寫hashCode方法。如果不這樣的話,就會違反Object類的hashCode方法的通用約定,導致這個類無法與所有基於雜湊值的集合類結合在一起正常工作,包括HashMap,HashSet和Hashtable。
2.4.繼承和過載的區別?
參考答案:
Java的繼承是子類物件繼承父類物件的成員屬性和成員方法,只允許單繼承。 在繼承的過程中可以實現方法的重寫(也稱為覆蓋),即子類定義一個方法,覆蓋從父類那裡繼承來的同名的方法。每當字類物件呼叫該方法時都是子類自己定義的方法,只有使用super關鍵字或父類名為字首時,才會呼叫父類原來的方法。方法覆蓋時,子類應與父類有完全相同的方法名,返回值型別和引數列表,子類中的覆蓋方法不能使用比父類中被覆蓋的方法更嚴格的訪問許可權。 方法過載要求是有兩個或多個方法名相同,只是方法引數列表不同的方法,它對返回值型別沒有限定。
2.5.請在下表對應的作用域可以訪問的位置上打上“√”不能訪問的打上“x”
作用域 | 當前類 | 同一package | 子孫類 | 其他 |
---|---|---|---|---|
Public | ||||
Protected | ||||
Default | ||||
Private |
參考答案:
作用域 | 當前類 | 同一package | 子孫類 | 其他 |
---|---|---|---|---|
Public | √ | √ | √ | √ |
Protected | √ | √ | √ | x |
Default | √ | √ | x | x |
Private | √ | x | x | x |
2.6.abstract class和interface有什麼區別
參考答案:
首先,從語法角度來說。abstract class方法中可以有自己的資料成員,也可以有非abstract的成員方法,並賦予方法的預設行為,而在interface方式中一般不定義成員資料變數,所有的方法都是abstract,方法不能擁有預設的行為。 其次,從程式設計的角度來說。abstract class在Java語言中表示的是一種繼承關係,一個類只能使用一次繼承關係,而一個類可以實現多個interface。 最後,從問題域的角度來說。abstract class在Java語言中體現了一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在“is a”關係,即父類和派生類在概念本質上應該是相同的。對於interface來收則不然,並不要求interface的實現者何interface定義在概念本質上是一致的,僅僅是實現了interface定義的契約而已。
2.7.面向物件的3個基本特性
參考答案:
面向物件的3個基本特徵為:封裝、繼承、多型。
2.8.面向物件的特徵有哪些方面?簡單描述對這些特徵的理解
參考答案:
面向物件的特徵主要有以下幾個方面: 1)抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面:一是抽象的屬性,二是抽象的方法。 2)繼承:繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加新的方法使之更適合特殊的需要。 3)封裝:封裝是把過程和資料包圍起來,對資料的訪問職能通過已定義的潔面。面向物件設計始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的物件,這些物件通過一個受保護的藉口訪問其他物件。 4)多型:多型性是指允許不同類的物件對同一訊息作出響應,是類的多種表現方式,比如同名不同參。多型性包括引數化多型性和包含多型性,具體表現在過載和重寫。多型性語言具有靈活、抽象、行為共享、程式碼共享的優勢,很好的解決了應用程式函式同名問題。
2.9.一個subclass怎麼呼叫superclass中的方法(myMethod)和建構函式?
參考答案:
子類subclass例項可以直接呼叫父類superclass未被重寫的方法;若子類重寫父類方法,可以在子類內通過”super.方法名()”的形式呼叫父類方法,例如:super.myMethod();。 建立子類例項時預設呼叫父類無參的構造方法,若呼叫父類有參的構造方法就可以在子類構造方法第一行通過”super(引數)”形式呼叫。
2.10.構造器Constructor是否可被override?
參考答案:
構造器Constructior不能被繼承,因此不能被重寫override,但可以被過載overload。