1. 程式人生 > >BATJ架構師常見面試題匯總之一

BATJ架構師常見面試題匯總之一

指向 char final 基本操作 方法 子類 cto 機制 const

1.面向對象和面向過程的區別

面向過程

優點:性能比面向對象高,因為類調用時需要實例化,開銷比較大,比較消耗資源;比如單片機、嵌入式開發、Linux/Unix等一般采用面向過程開發,性能是最重要的因素。

缺點:沒有面向對象易維護、易復用、易擴展

面向對象

優點:易維護、易復用、易擴展,由於面向對象有封裝、繼承、多態性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護

缺點:性能比面向過程低

2.Java的四個基本特性(抽象、封裝、繼承,多態)

抽象:就是把現實生活中的某一類東西提取出來,用程序代碼表示,我們通常叫做類或者接口。抽象包括兩個方面:一個是數據抽象,一個是過程抽象。數據抽象也就是對象的屬性。過程抽象是對象的行為特征。

封裝:把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行封裝隱藏。封裝分為屬性的封裝和方法的封裝。

繼承:是對有著共同特性的多類事物,進行再抽象成一個類。這個類就是多類事物的父類。父類的意義在於抽取多類事物的共性。

多態:允許不同類的對象對同一消息做出響應。方法的重載、類的覆蓋正體現了多態。

3.重載和重寫的區別

重載:發生在同一個類中,方法名必須相同,參數類型不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。

重寫:發生在父子類中,方法名、參數列表必須相同,返回值小於等於父類,拋出的異常小於等於父類,訪問修飾符大於等於父類;如果父類方法訪問修飾符為private則子類中就不是重寫。

4.構造器Constructor是否可被override

構造器不能被重寫,不能用static修飾構造器,只能用public

private protected這三個權限修飾符,且不能有返回語句。

5.訪問控制符public,protected,private,以及默認的區別

private只有在本類中才能訪問;

public在任何地方都能訪問;

protected在同包內的類及包外的子類能訪問;

默認不寫在同包內能訪問。

6是否可以繼承String類#

String類是final類故不可以繼承,一切由final修飾過的都不能繼承。

7.String和StringBuffer、StringBuilder的區別

可變性

String類中使用字符數組保存字符串,private

final char value[],所以string對象是不可變的。StringBuilder與StringBuffer都繼承自AbstractStringBuilder類,在AbstractStringBuilder中也是使用字符數組保存字符串,char[]

value,這兩種對象都是可變的。

線程安全性

String中的對象是不可變的,也就可以理解為常量,線程安全。AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的。StringBuilder並沒有對方法進行加同步鎖,所以是非線程安全的。

性能

每次對String 類型進行改變的時候,都會生成一個新的String 對象,然後將指針指向新的String 對象。StringBuffer每次都會對

StringBuffer 對象本身進行操作,而不是生成新的對象並改變對象引用。相同情況下使用

StirngBuilder 相比使用

StringBuffer 僅能獲得10%~15% 左右的性能提升,但卻要冒多線程不安全的風險。

8.hashCode和equals方法的關系

equals相等,hashcode必相等;hashcode相等,equals可能不相等。

9.抽象類和接口的區別

語法層次

抽象類和接口分別給出了不同的語法定義。

設計層次

抽象層次不同,抽象類是對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。抽象類是自底向上抽象而來的,接口是自頂向下設計出來的。

跨域不同

抽象類所體現的是一種繼承關系,要想使得繼承關系合理,父類和派生類之間必須存在"is-a"

關系,即父類和派生類在概念本質上應該是相同的。對於接口則不然,並不要求接口的實現者和接口定義在概念本質上是一致的,僅僅是實現了接口定義的契約而已,"like-a"的關系。

10.自動裝箱與拆箱

裝箱:將基本類型用它們對應的引用類型包裝起來;

拆箱:將包裝類型轉換為基本數據類型;

Java使用自動裝箱和拆箱機制,節省了常用數值的內存開銷和創建對象的開銷,提高了效率,由編譯器來完成,編譯器會在編譯期根據語法決定是否進行裝箱和拆箱動作。
後續會盡快更新的 大家有什麽想法可以評論出來的

BATJ架構師常見面試題匯總之一