面試總結一——基礎知識

面試總結一——基礎知識

1。 ==和equals方法究竟有什麼區別?

a:==是比較運算子,而equals是方法,二者目的都是為了比較物件是否一致

b:equals屬於Object類的方法,不重寫時與==等同,比較基本資料型別的值,比較引用物件的雜湊值

c:一般final修飾的類都重寫了equals方法,比如String,Double,Integer等

d:自定義類,為了比較內容是否一致,會重寫hashCode和equals方法;

2。 靜態變數和例項變數的區別?

靜態變數也叫作類變數,見名知意,是被static修飾的變數,屬於類,在記憶體中獨佔一份,透過類名。變數名獲取,

而例項變數,屬於物件,透過引用名。變數名獲取(但多數時候例項變數為private修飾,需要透過get方法獲取)

3。 Overload和Override的區別?

‘load’與‘ride’,也就是載入和重寫。那麼將方法比作加工廠,引數就是加工材料,每次加入的材料不同,生產同類或不同類的產品,重寫就是這樣的原理:同名方法,不同引數,返回型別相同或不同的結果。而過載就是在不同的地方用同樣的加工廠,同樣的材料,走不同流程,來獲取同一類產品。

4。 abstract class和interface有什麼區別?

應當從三個方面來說,分別是語法,定義,用途

語法:

a:抽象類,一言以蔽之,包羅永珍,而介面,只能定義常量,抽象方法,靜態方法,預設方法

b:類只能繼承一個抽象類,而類能實現多個介面

定義:

抽象類是具體事物的共性抽象提取,而介面是某一行為的規範

用途:

抽象類用以程式碼重構,減少程式碼量,而介面用以規範開發,解耦合

5。 String,StringBuffer與StringBuilder的區別?

為了確保String類的安全性,設計師將其設定為不可變類,避免被重寫時引發未知混亂,並能將值相同的字串,指向同一記憶體,節約資源。但如果要實現字串拼接,採用String會短時間內反覆建立大量物件,佔用記憶體,故有了StringBuffer與StringBuilder的存在,二者都實現了可變字串;但在多執行緒下,怎麼保證可變字串讀寫安全?於是有了StringBuffer,其大量方法被synchronized修飾。

6。 執行時異常與一般異常有何異同?

異常主要分為兩大類Error和Exception,而Exception又分為Runtime Exception 和Not Runtime Exception;

Error:系統異常和編譯異常,未系統不可捕捉錯誤

Runtime Exception:執行期異常,是虛擬機器的直譯器對使用者行為無法解釋時報錯

Not Runtime Exception:在編譯期即能檢測出的錯誤

7。 深複製和淺複製的區別是什麼?

定義:

淺克隆:根據原有物件內容,複製建立新的物件,新物件與被複制物件的屬性,其引用指向於同一物件(屬性不復制)

深克隆:作用於淺克隆類似,但是新物件屬性,其引用指向於被複制物件的屬性引用指向物件的複製(屬性複製)

實現:

深克隆:被克隆類以及被克隆類的引用必須實現Serializable介面;其本質是物件流的序列化與反序列

淺克隆:被克隆物件需要實現Cloneable介面,然後呼叫Object類的clone方法

範例:

面試總結一——基礎知識

8。 switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

switch case支援六種資料型別

整數型:byte,short,int

字元型:char

字串:String(1。7以後)

列舉: Enum(1。7以後)

9。 short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?

這其中涉及了兩點:型別轉化和特殊運算,s1是short型別,與作為int型別的1相加後其結果值為int型別,而對於+=這類的運算,java直譯器做了特殊最佳化,會自動判別結果型別。故而,s1 = s1 + 1存在型別不對的問題,而s1 +=1,是正確的

10。 Math。round(11。5)等於多少? Math。round(-11。5)等於多少?

Math類中提供了三個與取整有關的方法:ceil、floor、round,

ceil: 其英文意義是天花板,該方法就表示向上取整,即獲取大於或等於引數的最小整數

floor: 其英文意義是地板,該方法就表示向下取整,即獲取小於或等於引數的最小整數;

round:它表示“四捨五入”,演算法為Math。round(x+0。5),即將原來的數字加上0。5後再向下取整,所以,Math。round(11。5)的結果為12,Math。round(-11。5)的結果為-11。

11。 Java程式初始化的順序是怎樣的

在JAVA語言中,當例項化物件時,物件所在類的所有成員變數首先要進行初始化,只有當所有類成員完成初始化後,才會呼叫物件所在類的建構函式建立物件。

初始化一般遵循3個原則(優先順序依次遞減):

1靜態物件(變數)優先於非靜態物件(變數)初始化,其中靜態物件(變數)只初始化一次。而非靜態物件(變數)可能會初始化多次

2父類優先子類進行初始化

3按照成員變數定義順序進行初始化,即變數定義散佈於定義方法之中,它們依然在任何方法(包括構造方法)被呼叫之前先初始化。

Java程式初始化工作可以在許多不同的程式碼塊中來完成,它們執行的順序如下:(父類靜態變數,父類靜態程式碼塊),(子類靜態變數,子類靜態程式碼塊),(父類非靜態變數,父類非靜態程式碼塊),父類建構函式,(子類非靜態變數,子類非靜態程式碼塊),子類建構函式。

12。 簡述面向物件的幾大特徵

1封裝:

封裝是保證軟體部件具有優良的模組性的基礎,封裝的目標就是要實現軟體部件的“高內聚、低耦合”,防止程式相互依賴性而帶來的變動影響。在面向物件的程式語言中,物件是封裝的最基本單位,面向物件的封裝比傳統語言的封裝更為清晰、更為有力。面向物件的封裝就是把描述一個物件的屬性和行為的程式碼封裝在一個“模組”中,也就是一個類中,屬性用變數定義,行為用方法進行定義,方法可以直接訪問同一個物件中的屬性。通常情況下,只要記住讓變數和訪問這個變數的方法放在一起,將一個類中的成員變數全部定義成私有的,只有這個類自己的方法才可以訪問到這些成員變數,這就基本上實現物件的封裝。把握一個原則:把對同一事物進行操作的方法和相關的方法放在同一個類中,把方法和它操作的資料放在同一個類中。

2。抽象:

抽象就是找出一些事物的相似和共性之處,然後將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,並且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。例如,看到一隻螞蟻和大象,你能夠想象出它們的相同之處,那就是抽象。抽象包括行為抽象和狀態抽象兩個方面。例如,定義一個Person類,如下:

class Person{

String name;

int age;

}

人本來是很複雜的事物,有很多方面,但因為當前系統只需要瞭解人的姓名和年齡,所以上面定義的類中只包含姓名和年齡這兩個屬性,這就是一種抽像,使用抽象可以避免考慮一些與目標無關的細節。

3。繼承:

在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類資料和方法的機制,這是類之間的一種關係,提高了軟體的可重用性和可擴充套件性。

4多型:

多型是指程式中定義的引用變數所指向的具體型別和透過該引用變數發出的方法呼叫在程式設計時並不確定,而是在程式執行期間才確定,即一個引用變數倒底會指向哪個類的例項物件,該引用變數發出的方法呼叫到底是哪個類中實現的方法,必須在由程式執行期間才能決定。因為在程式執行時才確定具體的類,這樣,不用修改源程式程式碼,就可以讓引用變數繫結到各種不同的類實現上,從而導致該引用呼叫的具體方法隨之改變,即不修改程式程式碼就可以改變程式執行時所繫結的具體程式碼,讓程式可以選擇多個執行狀態,這就是多型性。多型性增強了軟體的靈活性和擴充套件性。例如,下面程式碼中的UserDao是一個介面,它定義引用變數userDao指向的例項物件由daofactory。getDao()在執行的時候返回,有時候指向的是UserJdbcDao這個實現,有時候指向的是UserHibernateDao這個實現,這樣,不用修改原始碼,就可以改變userDao指向的具體類實現,從而導致userDao。insertUser()方法呼叫的具體程式碼也隨之改變,即有時候呼叫的是UserJdbcDao的insertUser方法,有時候呼叫的是UserHibernateDao的insertUser方法:

UserDao userDao =daofactory。getDao(); userDao。insertUser(user);

13。 兩種引數傳遞方式

1。值傳遞:實參將值傳遞給形參,形參只是用實參的值初始化一個臨時的儲存單元,因此雖然值相同,但是儲存單元不同,因此對形參的改變不會影響實參的值。

2。引用傳遞:傳遞的是物件(物件的地址),形參與實參同一塊儲存單元,對形參的改變

會影響實參的值

原始資料型別按值傳遞,包裝型別按引用傳遞。

例項

面試總結一——基礎知識

結論:可以借用區域性變數理解,有成員變數a,b和區域性變數a,b;區域性變數a = 成員變數a,區域性變數b = 成員變數 b,在方法結束後區域性變數銷燬,並不改變成員變數a與b的實際值