Java高頻OOP(面向對象編程)面試50題(含答案)(一)

1、什么是B/S架構?什么是C/S架構

1.B/S(Browser/Server),瀏覽器/服務器程序

2.C/S(Client/Server),客戶端/服務端,桌面應用程序

2、Java都有那些開發(fā)平臺?

1.JAVA SE:主要用在客戶端開發(fā)

2.JAVA EE:主要用在web應用程序開發(fā)

3.JAVA ME:主要用在嵌入式應用程序開發(fā)

3、什么是JDK?什么是JRE?

1.JDK:java development kit:java開發(fā)工具包,是開發(fā)人員所需要安裝的環(huán)境

2.JRE:java runtime environment:java運行環(huán)境,java程序運行所需要安裝的環(huán)境

4、Java語言有哪些特點

1.簡單易學、有豐富的類庫

2.面向對象(Java最重要的特性,讓程序耦合度更低,內聚性更高)

3.與平臺無關性(JVM是Java跨平臺使用的根本)

4.可靠安全

5.支持多線程

5、面向對象和面向過程的區(qū)別

1.面向過程:一種較早的編程思想,顧名思義就是該思想是站著過程的角度思考問題,強調的就是功能行為,功能的執(zhí)行過程,即先后順序,而每一個功能我們都使用函數(shù)(類似于方法)把這些步驟一步一步實現(xiàn)。使用的時候依次調用函數(shù)就可以了。

2.面向對象:一種基于面向過程的新編程思想,顧名思義就是該思想是站在對象的角度思考問題,我們把多個功能合理放到不同對象里,強調的是具備某些功能的對象。具備某種功能的實體,稱為對象。面向對象最小的程序單元是:類。面向對象更加符合常規(guī)的思維方式,穩(wěn)定性好,可重用性強,易于開發(fā)大型軟件產(chǎn)品,有良好的可維護性。在軟件工程上,面向對象可以使工程更加模塊化,實現(xiàn)更低的耦合和更高的內聚。

6、什么是數(shù)據(jù)結構?

計算機保存,組織數(shù)據(jù)的方式

7、Java的數(shù)據(jù)結構有那些?

1.線性表(ArrayList)

2.鏈表(LinkedList)

3.棧(Stack)

4.隊列(Queue)

5.圖(Map)

6.樹(Tree)

8、什么是OOP?

面向對象編程

9、類與對象的關系?

類是對象的抽象,對象是類的具體,類是對象的模板,對象是類的實例

10、Java中有幾種數(shù)據(jù)類型

整型:byte,short,int,long

浮點型:?oat,double

字符型:char

布爾型:boolean

11、標識符的命名規(guī)則。

1.標識符的含義:是指在程序中,我們自己定義的內容,譬如,類的名字,方法名稱以及變量名稱等等,都是標識符。

2.命名規(guī)則:(硬性要求)標識符可以包含英文字母,0-9的數(shù)字,$以及_ 標識符不能以數(shù)字開頭標識符不是關鍵字

3.命名規(guī)范:(非硬性要求)類名規(guī)范:首字符大寫,后面每個單詞首字母大寫(大駝峰式)。 變量名規(guī)范:首字母小寫,后面每個單詞首字母大寫(小駝峰式)。方法名規(guī)范:同變量名。

12、instanceof關鍵字的作用

instanceof 嚴格來說是Java中的一個雙目運算符,用來測試一個對象是否為一個類的實例,用法為:

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

其中 obj 為一個對象,Class 表示一個類或者一個接口,當 obj 為 Class 的對象,或者是其直接或間接子類,或者是其接口的實現(xiàn)類,結果result 都返回 true,否則返回false。注意:編譯器會檢查 obj 是否能轉換成右邊的class類型,如果不能轉換則直接報錯,如果不能確定類型,則通過編譯,具體看運行時定。

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

13、什么是隱式轉換,什么是顯式轉換

顯示轉換就是類型強轉,把一個大類型的數(shù)據(jù)強制賦值給小類型的數(shù)據(jù);隱式轉換就是大范圍的變量能夠接受小范圍的數(shù)據(jù);隱式轉換和顯式轉換其實就是自動類型轉換和強制類型轉換。

14、Char類型能不能轉成int類型?能不能轉化成string類型,能不能轉成double類型

Char 在 java 中 也 是 比 較 特 殊 的 類 型 , 它 的 int 值 從 1 開 始 , 一 共 有 2 的 16 次 方 個 數(shù) 據(jù) ; Char<int<long<?oat<double;Char類型可以隱式轉成int,double類型,但是不能隱式轉換成string;如果char類 型轉成byte,short類型的時候,需要強轉。

15、什么是拆裝箱?

裝箱就是自動將基本數(shù)據(jù)類型轉換為包裝器類型(int–>Integer);調用方法:Integer的
valueOf(int) 方法拆箱就是自動將包裝器類型轉換為基本數(shù)據(jù)類型(Integer–>int)。調用方法:Integer的intValue方 法在Java SE5之前,如果要生成一個數(shù)值為10的Integer對象,必須這樣進行:
而在從Java SE5開始就提供了自動裝箱的特性,如果要生成一個數(shù)值為10的Integer對象,只需要這樣就可以了:

面試題1: 以下代碼會輸出什么?

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

結果:

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

16、Java中的包裝類都是那些?

byte:Byte,short:Short,int:Integer,long:Long,?oat:Float,double:Double,char:Character ,boolean:Boolean

17、一個java類中包含那些內容?

屬性、方法、內部類、構造方法、代碼塊。

18、那針對浮點型數(shù)據(jù)運算出現(xiàn)的誤差的問題,你怎么解決?

使用Bigdecimal類進行浮點型數(shù)據(jù)的運算

19、面向對象的特征有哪些方面?

抽象:抽象是將一類對象的共同特征總結出來構造類的過程, 包括數(shù)據(jù)抽象和行為抽象兩方面。抽象只關注對象有哪些屬性和行為,并不關注這些行為的細節(jié)是什么。

繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過程.提供繼承信息的類被稱為父類(超類、基類) ;得到繼承信息的類被稱為子類(派生類)。繼承讓變化中的軟件系統(tǒng)有了一定的延續(xù)性 ,同時繼承也是封裝程序中可變因素的重要手段(如果不能理解請閱讀閻宏博士的《Java 與模式》或《設計模式精解》中.關于橋梁模式的部分)。

封裝:通常認為封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來,對數(shù)據(jù)的訪問只能通過已定義的接口。面向對象的本質就是將現(xiàn)實世界描繪成一系列完全自 治、封閉的對象。我們在類中編寫的方法就是對實現(xiàn)細節(jié)的一種封裝;我們編寫一個類就是對數(shù)據(jù)和數(shù)據(jù)操作的封裝??梢哉f,封裝就是隱藏一切可隱藏的東西, 只向外界提供最簡單的編程接口(可以想象普通洗衣機和全自動洗衣機的差別, 明顯全自動洗衣機封裝更好因此操作起來更簡單;我們現(xiàn)在使用的智能手機也是 封裝得足夠好的,因為幾個按鍵就搞定了所有的事情)。

多態(tài)性:多態(tài)性是指允許不同的類型的對象對同一消息作出不同的響應。簡單的說就是用同樣的對象引用調用同樣的方法但是做了不同的事情。多態(tài)性分為編譯時的多態(tài)性和運行時的多態(tài)性。如果將對象的方法視為對象向外界提供的服務,那么運行時的多態(tài)性可以解釋為:當 A 系統(tǒng)訪問 B 系統(tǒng)提供的服務時,B 系統(tǒng)有多種提供服務的方式,但一切對 A 系統(tǒng)來說都是透明的(就像電動剃須刀是 A 系統(tǒng),它的供電系統(tǒng)是 B 系統(tǒng),B 系統(tǒng)可以使用電池供電或者用交流電, 甚至還有可能是太陽能,A 系統(tǒng)只會通過 B 類對象調用供電的方法,但并不知道供電系統(tǒng)的底層實現(xiàn)是什么,究竟通過何種方式獲得了動力)。方法重載(overload)實現(xiàn)的是編譯時的多態(tài)性(也稱為前綁定),而方法重寫(override) 實現(xiàn)的是運行時的多態(tài)性(也稱為后綁定)。運行時的多態(tài)是面向對象最精髓的東西,要實現(xiàn)多態(tài)需要做兩件事:

1). 方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法);

2). 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調用同樣的方法就會根據(jù)子類對象的不同而表現(xiàn)出不同的行為)。

20、訪問修飾符 public,private,protected,以及不寫(默認) 時的區(qū)別?

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

類的成員不寫訪問修飾時默認為 default。默認對于同一個包中的其他類相當于公 開(public),對于不是同一個包中的其他類相當于私有(private)。受保護 (protected)對子類相當于公開,對不是同一包中的沒有父子關系的類相當于私 有。Java 中,外部類的修飾符只能是 public 或默認,類的成員(包括內部類)的 修飾符可以是以上四種。

21、String 是最基本的數(shù)據(jù)類型嗎?

不是。Java 中的基本數(shù)據(jù)類型只有 8 個:byte、short、int、long、?oat、double、 char、boolean;除了基本類型(primitive type), 剩下的都是引用類型(reference type),Java 5 以后引入的枚舉類型也算是一種比較特殊的引用類型。

22、?oat f=3.4;是否正確?

答:不正確。3.4 是雙精度數(shù),將雙精度型(double)賦值給浮點型(?oat)屬于 下轉型(down-casting,也稱為窄化)會造成精度損失, 因此需要強制類型轉換 ?oat f =(?oat)3.4; 或者寫成 ?oat f =3.4F;。

23、short s1 = 1; s1 = s1 + 1;有錯嗎?short s1 = 1; s1 += 1; 有錯嗎?

對于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 類型,因此 s1+1 運算結果也是 int 型,需要強制轉換類型才能賦值給 short 型。而 short s1 = 1; s1 += 1;可以正確 編譯,因為 s1+= 1;相當于 s1 = (short)(s1 + 1);其中有隱含的強制類型轉換。

24、重載和重寫的區(qū)別

重寫(Override)從字面上看,重寫就是 重新寫一遍的意思。其實就是在子類中把父類本身有的方法重新寫一遍。子類繼承了父類原有的方法,但有時子類并不想原封不動的繼承父類中的某個方法,所以在方法名,參數(shù)列表,返回類型(除過子類中方法的返回值是父類中方法返回值的子類時)都相同的情況下, 對方法體進行修改或重寫,這就是重寫。但要注意子類函數(shù)的訪問修飾權限不能少于父類的。

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

原因: 在某個范圍內的整型數(shù)值的個數(shù)是有限的,而浮點數(shù)卻不是。重寫 總結:1.發(fā)生在父類與子類之間2.方法名,參數(shù)列表,返回類型(除過子類中方法的返回類型是父類中返回類型的子類)必須相同3.訪問修飾符的限制一定要大于被重寫方法的訪問修飾符(public>protected>default>private)4.重寫方法一定不能拋出新的檢查異?;蛘弑缺恢貙懛椒ㄉ昝鞲訉挿旱臋z查型異常

重載(Overload)在一個類中,同名的方法如果有不同的參數(shù)列表(參數(shù)類型不同、參數(shù)個數(shù)不同甚至是參數(shù)順序不同) 則視為重載。同時,重載對返回類型沒有要求,可以相同也可以不同,但不能通過返回類型是否相同來判斷重載。

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

重載總結:

1.重載Overload是一個類中多態(tài)性的一種表現(xiàn)

2.重載要求同名方法的參數(shù)列表不同(參數(shù)類型,參數(shù)個數(shù)甚至是參數(shù)順序)

3.重載的時候,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數(shù)的區(qū)分標準

25、equals與==的區(qū)別==:

== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。

1、比較的是操作符兩端的操作數(shù)是否是同一個對象。

2、兩邊的操作數(shù)必須是同一類型的(可以是父子類之間)才能編譯通過。

3、比較的是地址,如果是具體的阿拉伯數(shù)字的比較,值相等則為true,如:int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。

equals:equals用來比較的是兩個對象的內容是否相等,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。

總結:所有比較是否相等時,都是用equals 并且在對常量相比較時,把常量寫在前面,因為使用object的equals object可能為null 則空指針在阿里的代碼規(guī)范中只使用equals ,阿里插件默認會識別,并可以快速修改,推薦安裝阿里插件來排查老代碼使用“==”,替換成equals

26、++i與i++的區(qū)別i++:

先賦值,后計算++i:先計算,后賦值

27、程序的結構有那些?

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

28、數(shù)組實例化有幾種方式?

靜態(tài)實例化:創(chuàng)建數(shù)組的時候已經(jīng)指定數(shù)組中的元素,

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

動態(tài)實例化:實例化數(shù)組的時候,只指定了數(shù)組程度,數(shù)組中所有元素都是數(shù)組類型的默認值

29、Java中各種數(shù)據(jù)默認值

Byte,short,int,long默認值都是0 Boolean默認值是falseChar類型的默認值是’’Float與double類型的默認是0.0對象類型的默認值是null

30、Java常用包有那些?

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

31、Object類常用方法有那些?

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

32、java中有沒有指針?

有指針,但是隱藏了,開發(fā)人員無法直接操作指針,由jvm來操作指針

33、java中是值傳遞引用傳遞?

理論上說,java都是引用傳遞,對于基本數(shù)據(jù)類型,傳遞是值的副本,而不是值本身。對于對象類型,傳遞是對象的引用,當在一個方法操作操作參數(shù)的時候,其實操作的是引用所指向的對象。

34、實例化數(shù)組后,能不能改變數(shù)組長度呢?

不能,數(shù)組一旦實例化,它的長度就是固定的

35、假設數(shù)組內有5個元素,如果對數(shù)組進行反序,該如何做?

創(chuàng)建一個新數(shù)組,從后到前循環(huán)遍歷每個元素,將取出的元素依次順序放入新數(shù)組中

36、形參與實參區(qū)別

實參(argument):全稱為"實際參數(shù)"是在調用時傳遞給函數(shù)的參數(shù). 實參可以是常量、變量、表達式、函數(shù)等, 無論實參是何種類型的量,在進行函數(shù)調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。

形參(parameter):全稱為"形式參數(shù)" 由于它不是實際存在變量,所以又稱虛擬變量。是在定義函數(shù)名和函數(shù)體的時候使用的參數(shù),目的是用來接收調用該函數(shù)時傳入的參數(shù).在調用函數(shù)時,實參將賦值給形參。因而,必須注意實參的個數(shù),類型應與形參一一對應,并且實參必須要有確定的值。

形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內都可以使用, 離開該函數(shù)則不能使用。實參出現(xiàn)在主調函數(shù)中,進入被調函數(shù)后,實參變量也不能使用。形參和實參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調用時, 主調函數(shù)把實參的值傳送給被調函數(shù)的形參從而實現(xiàn)主調函數(shù)向被調函數(shù)的數(shù)據(jù)傳送。

1.形參變量只有在被調用時才分配內存單元,在調用結束時, 即可釋放所分配的內存單元。因此,形參只有在函數(shù)內部有效。 函數(shù)調用結束返回主調函數(shù)后則不能再使用該形參變量。

2.實參可以是常量、變量、表達式、函數(shù)等, 無論實參是何種類型的量,在進行函數(shù)調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。

3.實參和形參在數(shù)量上,類型上,順序上應嚴格一致, 否則會發(fā)生“類型不匹配”的錯誤。

4.函數(shù)調用中發(fā)生的數(shù)據(jù)傳送是單向的。 即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函數(shù)調用過程中, 形參的值發(fā)生改變,而實參中的值不會變化。

5.當形參和實參不是指針類型時,在該函數(shù)運行時,形參和實參是不同的變量,他們在內存中位于不同的位置,形參將實參的內容復制一份,在該函數(shù)運行結束的時候形參被釋放,而實參內容不會改變。

而如果函數(shù)的參數(shù)是指針類型變量,在調用該函數(shù)的過程中,傳給函數(shù)的是實參的地址,在函數(shù)體內部使用的也是實參的地址,即使用的就 是實參本身。所以在函數(shù)體內部可以改變實參的值。

37、構造方法能不能顯式調用?

不能,構造方法當成普通方法調用,只有在創(chuàng)建對象的時候它才會被系統(tǒng)調用

38、什么是方法重載?

方法的重載就是在同一個類中允許同時存在一個以上的同名方法,只要它們的參數(shù)個數(shù)或者類型不同即可。在這種情況下,該方法就叫被重載了,這個過程稱為方法的重載(override)

39、構造方法能不能重寫?能不能重載?

可以重載,但不能重寫。

40、內部類與靜態(tài)內部類的區(qū)別?

靜態(tài)內部類相對與外部類是獨立存在的,在靜態(tài)內部類中無法直接訪問外部類中變量、方法。如果要訪問的話,必須要new一個外部類的對象,使用new出來的對象來訪問。但是可以直接訪問靜態(tài)的變量、調用靜態(tài)的方法;普通內部類作為外部類一個成員而存在,在普通內部類中可以直接訪問外部類屬性,調用外部類的方法。如果外部類要訪問內部類的屬性或者調用內部類的方法,必須要創(chuàng)建一個內部類的對象,使用該對象訪問屬性或者調用方法。如果其他的類要訪問普通內部類的屬性或者調用普通內部類的方法,必須要在外部類中創(chuàng)建一個普通內部類的對象作為一個屬性,外同類可以通過該屬性調用普通內部類的方法或者訪問普通內部類的屬性如果其他的類要訪問靜態(tài)內部類的屬性或者調用靜態(tài)內部類的方法,直接創(chuàng)建一個靜態(tài)內部類對象即可。

41、Static關鍵字有什么作用?

Static可以修飾內部類、方法、變量、代碼塊Static修飾的類是靜態(tài)內部類Static修飾的方法是靜態(tài)方法,表示該方法屬于當前類的,而不屬于某個對象的,靜態(tài)方法也不能被重寫,可以直接使用類名來調用。在static方法中不能使用this或者super關鍵字。Static修飾變量是靜態(tài)變量或者叫類變量,靜態(tài)變量被所有實例所共享,不會依賴于對象。靜態(tài)變量在內存中只有一份拷貝,在JVM加載類的時候,只為靜態(tài)分配一次內存。Static修飾的代碼塊叫靜態(tài)代碼塊,通常用來做程序優(yōu)化的。靜態(tài)代碼塊中的代碼在整個類加載的時候只會執(zhí)行一次。靜態(tài)代碼塊可以有多個,如果有多個,按照先后順序依次執(zhí)行。

42、final在java中的作用,有哪些用法?

final也是很多面試喜歡問的地方,但我覺得這個問題很無聊,通常能回答下以下5點就不錯了:

1. 被fifinal修飾的類不可以被繼承

2. 被fifinal修飾的方法不可以被重寫

3. 被fifinal修飾的變量不可以被改變.如果修飾引用,那么表示引用不可變,引用指向的內容可變.

4. 被fifinal修飾的方法,JVM會嘗試將其內聯(lián),以提高運行效率

5. 被fifinal修飾的常量,在編譯階段會存入常量池中.除此之外,編譯器對fifinal域要遵守的兩個重排序規(guī)則更好:在構造函數(shù)內對一個fifinal域的寫入,與隨后把這個被構造對象的引用賦值給一個引用變量,這兩個操作之間不能重排序初次讀一個包含fifinal域的對象的引用,與隨后初次讀這個fifinal域,這兩個操作之間不能重排序

43、StringString StringBuffffer 和 StringBuilder 的區(qū)別是什么?

String是只讀字符串,它并不是基本數(shù)據(jù)類型,而是一個對象。從底層源碼來看是一個fifinal類型的字符數(shù)組,所引用的字符串不能被改變,一經(jīng)定義,無法再增刪改。每次對String的操作都會生成新的String對象

Java高頻OOP(面向對象編程)面試50題(含答案)(一)

每次+操作 : 隱式在堆上new了一個跟原字符串相同的StringBuilder對象,再調用append方法 拼接+后面的字符。StringBuffer與StringBuilder都繼承了AbstractStringBulder類,而AbtractStringBuilder又實現(xiàn)了CharSequence接口,兩個類都是用來進行字符串操作的。在做字符串拼接修改刪除替換時,效率比string更高。StringBuffer是線程安全的,Stringbuilder是非線程安全的。所以Stringbuilder比stringbuffer效率更高,StringBuffer的方法大多都加了synchronized關鍵字

44、String str=”aaa”,與String str=new String(“aaa”)一樣嗎?

一共有兩個引用,三個對象。因為”aa”與”bb”都是常量,常量的值不能改變,當執(zhí)行字符串拼接時候,會創(chuàng)建一個新的常量是” aabbb”,有將其存到常量池中。

45、講下java中的math類有那些常用方法?

Pow():冪運算Sqrt():平方根Round():四舍五入Abs():求絕對值Random():生成一個0-1的隨機數(shù),包括0不包括1

46、String類的常用方法有那些?

charAt:返回指定索引處的字符indexOf():返回指定字符的索引replace():字符串替換trim():去除字符串兩端空白split():分割字符串,返回一個分割后的字符串數(shù)組getBytes():返回字符串的byte類型數(shù)組length():返回字符串長度toLowerCase():將字符串轉成小寫字母toUpperCase():將字符串轉成大寫字符substring():截取字符串format():格式化字符串equals():字符串比較

47、Java中的繼承是單繼承還是多繼承

Java中既有單繼承,又有多繼承。對于java類來說只能有一個父類,對于接口來說可以同時繼承多個接口

48、Super與this表示什么?

Super表示當前類的父類對象This表示當前類的對象

49、普通類與抽象類有什么區(qū)別?

普通類不能包含抽象方法,抽象類可以包含抽象方法抽象類不能直接實例化,普通類可以直接實例化

50、什么是接口?為什么需要接口?

接口就是某個事物對外提供的一些功能的聲明,是一種特殊的java類,接口彌補了java單繼承的缺點

Java高頻OOP(面向對象編程)面試50題(含答案)(一)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容