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


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

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

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

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

2、Java都有那些開發平臺?

1.JAVA SE:主要用在客戶端開發

2.JAVA EE:主要用在web應用程序開發

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

3、什麼是JDK?什麼是JRE?

1.JDK:java development kit:java開發工具包,是開發人員所需要安裝的環境

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

4、Java語言有哪些特點

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

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

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

4.可靠安全

5.支持多線程

5、面向對象和麵向過程的區別

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

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

6、什麼是數據結構?

計算機保存,組織數據的方式

7、Java的數據結構有那些?

1.線性表(ArrayList)

2.鏈表(LinkedList)

3.棧(Stack)

4.隊列(Queue)

5.圖(Map)

6.樹(Tree)

8、什麼是OOP?

面向對象編程

9、類與對象的關係?

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

10、Java中有幾種數據類型

整型:byte,short,int,long

浮點型:float,double

字符型:char

布爾型:boolean

11、標識符的命名規則。

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

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

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

12、instanceof關鍵字的作用

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

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

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

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

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

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

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

Char 在 java 中 也 是 比 較 特 殊 的 類 型 , 它 的 int 值 從 1 開 始 , 一 共 有 2 的 16 次 方 個 數 據 ; Char

15、什麼是拆裝箱?

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

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

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

結果:

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

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

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

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

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

18、那針對浮點型數據運算出現的誤差的問題,你怎麼解決?

使用Bigdecimal類進行浮點型數據的運算

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

抽象:抽象是將一類對象的共同特徵總結出來構造類的過程, 包括數據抽象和行為抽象兩方面。抽象只關注對象有哪些屬性和行為,並不關注這些行為的細節是什麼。

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

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

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

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

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

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

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

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

21、String 是最基本的數據類型嗎?

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

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

答:不正確。3.4 是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於 下轉型(down-casting,也稱為窄化)會造成精度損失, 因此需要強制類型轉換 float f =(float)3.4; 或者寫成 float 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、重載和重寫的區別

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

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

原因: 在某個範圍內的整型數值的個數是有限的,而浮點數卻不是。重寫 總結:1.發生在父類與子類之間2.方法名,參數列表,返回類型(除過子類中方法的返回類型是父類中返回類型的子類)必須相同3.訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)4.重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常

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

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

重載總結:

1.重載Overload是一個類中多態性的一種表現

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

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

25、equals與==的區別==:

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

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

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

3、比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為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 則空指針在阿里的代碼規範中只使用equals ,阿里插件默認會識別,並可以快速修改,推薦安裝阿里插件來排查老代碼使用“==”,替換成equals

26、++i與i++的區別i++:

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

27、程序的結構有那些?

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

28、數組實例化有幾種方式?

靜態實例化:創建數組的時候已經指定數組中的元素,

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

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

29、Java中各種數據默認值

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

30、Java常用包有那些?

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

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

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

32、java中有沒有指針?

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

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

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

34、實例化數組後,能不能改變數組長度呢?

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

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

創建一個新數組,從後到前循環遍歷每個元素,將取出的元素依次順序放入新數組中

36、形參與實參區別

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

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

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

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

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

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

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

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

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

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

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

38、什麼是方法重載?

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

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

可以重載,但不能重寫。

40、內部類與靜態內部類的區別?

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

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

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

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

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

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

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

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

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

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

43、StringString StringBuffffer 和 StringBuilder 的區別是什麼?

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

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

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

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

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

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

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

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

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

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

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

48、Super與this表示什麼?

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

49、普通類與抽象類有什麼區別?

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

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

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


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

"


分享到:


相關文章: