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、父類引用變數指向子類對象(常見)

七、介面和抽象類的區別

區別:

  1. 介面中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
  2. 類可以實現很多個介面,但是只能繼承一個抽象類
  3. 類可以不實現抽象類和介面聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
  4. 抽象類可以在不提供介面方法實現的情況下實現介面。
  5. Java介面中聲明的變數默認都是final的。抽象類可以包含非final的變數。
  6. Java介面中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
  7. 介面是絕對抽象的,不可以被實例化,抽象類也不可以被實例化。
  8. 一個類實現介面的話要實現介面的所有方法,而抽象類不一定

兩者怎麼選擇呢?

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等等都有反射的實現。但是凡事都有兩面性,反射也會消耗系統的性能,增加複雜性等。