Java 面試題(一)
- 2019 年 10 月 5 日
- 筆記
一、基本數據類型的類型轉換
概述:Java程式中要求參與的計算的數據,必須要保證數據類型的一致性,如果數據類型不一致將發生類型的轉換。
特點:分為自動類型轉換和強制類型轉換
具體:自動類型轉換: 1、系統自動完成的,不需要程式設計師手動修改程式碼 2、將取值範圍小的類型 自動提升為 取值範圍大的類型 強制類型轉換: 1、需要程式設計師手動修改程式碼 2、語法: 範圍小的類型 變數名 = (範圍小的類型)範圍大的類型的數據 3、從範圍小 到 範圍大(將取值範圍大的類型強制轉換成取值範圍小的類型。)
注意:強制類型轉換可能會造成數據的丟失 Boolean類型不能發生強制類型轉換 byte short char 這三種數據類型發生數學運算時,會自動提升為int類型
二、if多分支語句和switch多分支語句的異同之處
相同:
都是分支語句,都可以進行超過一種情況進行判斷處理
不同:
switch更適合判斷條件單一的多種情況的判斷,在分支執行完後(如果沒有break跳出),不加判斷地執行下去;而if—elseif—else多分枝主要適用於分支較少的分支結構,判斷類型不是單一,只要一個分支被執行後,後邊的分支不再執行。
switch為等值判斷(不允許比如>= <=),而if為等值和區間都可以,if的使用範圍大。
三、面向過程和面向對象的區別
相同:
兩者都是軟體開發思想,先有面向過程,後有面向對象,針對面向過程不足之處推出了面向對象的開發思想。
不同:
編程思路不同: 面向過程以實現功能的函數開發為主,而面向對象要首先抽象出類、屬性及其方法,然後通過實例化類、執行方法來完成功能。
封裝性:都具有封裝性,但是面向過程是封裝的是功能,而面向對象封裝的是數據和功能。
面向對象具有繼承性和多態性,而面向過程沒有繼承性和多態性,所以面向對象優勢是明顯。
四、基本數據類型和包裝類
八個基本數據包裝類型:
基本數據類型 |
包裝類 |
---|---|
byte |
Byte |
boolean |
Boolean |
short |
Short |
char |
Character |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
為什麼要引入包裝類:
讓基本類型具備對象的特徵,實現更多的功能.
Java是一個面向對象的程式語言,基本類型並不具有對象的性質,為了讓基本類型也具有對象的特徵,就出現了包裝類型(如我們在使用集合類型Collection時就一定要使用包裝類型而非基本類型),它相當於將基本類型「包裝起來」,使得它具有了對象的性質,並且為其添加了屬性和方法,豐富了基本類型的操作。
舉例:int integer
int 一般做為數值參數就夠了
integer 一般做類型轉換的時候用的較多
Integer是int的封裝類,裡面有很多進行處理的靜態方法
Integer是對象而int不是,記憶體的分配位置也不一樣int是一種基本數據類型,而Integer是相應於int的類類型,稱為對象包裝。
實現這種對象包裝的目的主要是因為類能夠提供必要的方法,用於實現基本數據類型的數值與可列印字元串之間的轉換,以及一些其他的實用程式方法;
另外,有些數據結構庫類只能操作對象,而不支援基本數據類型的變數,包裝類能夠把基本數據類型轉換成等價的對象,從而可以利用數據結構庫類進行處理。
————————————————
版權聲明:本文為CSDN部落客「追夢者_wang」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/wang_8649/article/details/72129616
五、什麼是序列化
概述:
把JAVA對象轉換為位元組序列的過程就稱為對象的序列化。
作用:
一般用在持久化對象,把對象保存到磁碟中,或者在網路中傳遞對象時使用。
底層:
使用ObjectOutPutStream的writeObject(Object obj)的方法就可以將參數指定的對象進行序列化,並且把得到的位元組流寫到一個目標輸出流上去
使用:
只要一個類實現了java.io.Serializable介面就標識為可序列化類,使用對象流可以對該類生成的對象做操作。
注意:
Serializable介面本身什麼都沒有,僅僅作為一個標識存在,一般實現Serializable介面的對象還有一個serialVersionUID欄位(控制序列化版本號),如果不自己寫的話,jvm會聲明一個。如果已經序列化好的對象修改了類屬性,反序列化的時候會報錯。自己寫版本號的話,會把新增欄位的值設為null,不報錯。
六、java中的多態
有三個:
1、繼承的存在;(繼承是多態的基礎,沒有繼承就沒有多態)
2、子類重寫父類的方法;(具有相同的函數名稱、參數列表,並且子類的返回值與父類相同或者是父類返回類型的子類型;子類方法的訪問許可權不能小於父類方法的訪問許可權;子類方法不能比父類方法拋出更多的編譯時異常)
3、父類引用變數指向子類對象(常見)
七、介面和抽象類的區別
區別:
- 介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
- 類可以實現很多個介面,但是只能繼承一個抽象類
- 類可以不實現抽象類和介面聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
- 抽象類可以在不提供介面方法實現的情況下實現介面。
- Java介面中聲明的變數默認都是final的。抽象類可以包含非final的變數。
- Java介面中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
- 介面是絕對抽象的,不可以被實例化,抽象類也不可以被實例化。
- 一個類實現介面的話要實現介面的所有方法,而抽象類不一定
兩者怎麼選擇呢?
1.抽象類是對事物的抽象,它包含屬性和行為(方法)的抽象,而介面是對行為的一種抽象。我們在選擇時候可以根據這點來確定。如飛機和鳥,它沒有共同屬性,但是他們有共同的行為——飛,這個時候我們可以用介面。而民用飛機、戰鬥機等他們都是飛機一種,這個時候我們可以將飛機座位一個抽象類。
2.從設計層面來說,抽象類有很多子類,它是一種模板式方法。介面是一種行為規範,它是一種輻射式設計。什麼是模板式方法呢?舉個例子:PPT b,c,d都使用了A模板,現在A模板中增添了一個公共的功能,我們不需要對b,c,d就行改變。什麼是輻射式設計?舉個例子:上帝創造了動物,給每個動物都創建了吃、走等方法,各個動物具體的實現都不同,有一天上帝覺得動物們動的太慢了,於是又增加了一個跑的方法,那麼每個動物都要有一個新的具體實現跑的方式。
————————————————
版權聲明:本文為CSDN部落客「china_tanjun」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/qq_33253647/article/details/78052767
八、什麼是反射
概述
Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。
特點
反射提高了Java程式的靈活性和擴展性,降低耦合性,提高自適應能力。它允許程式創建和控制任何類的對象,無需提前硬編碼目標類。
反射會比通常的使用要慢,也會模糊程式的內部邏輯。
使用:
1、通過 Class 對象的 forName() 靜態方法來獲取,用的最多,2、直接通過 類名.class 的方式得到,該方法最為安全可靠,程式性能更高3、通過對象調用 getClass() 方法來獲取,通常應用在:比如你傳過來一個 Object類型的對象,而我不知道你具體是什麼類,用這種方法
通過 Class 類調用API可以獲取成員變數、成員方法、介面、超類、構造方法等
總結
靈活使用反射能讓我們程式碼更加靈活,這裡比如JDBC原生程式碼註冊驅動,Spring 的 AOP等等都有反射的實現。但是凡事都有兩面性,反射也會消耗系統的性能,增加複雜性等。