java 基礎知識鞏固(一)
1. &與&&區別?
&和&&都是邏輯運算子,都是判斷兩邊同時真則為真,否則為假;但是&&當第一個條件不成立之後,後面的條件都不執行了,而&則還是繼續執行,直到整個條件語句執行完為止。
2. 使用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變?
使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的物件中的內容還是可以改變的。
3. 靜態變數和例項變數的區別?
(1)在語法定義上的區別:靜態變數前要加static關鍵字,而例項變數前則不加。
(2)在程式執行時的區別:例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配到空間,才能使用這個例項變數。 靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。
總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態變數則可以直接使用類名來引用。靜態變數使用時,通過類名.名稱,例項變數必須要初始化後才能使用。例項變數是例項化後才會分配空間,而靜態變數當類載入時會分配空間。
4. 是否可以從一個static方法內部發出對非static方法的呼叫?
不可以。因為非static方法是要與物件關聯在一起的,必須建立一個物件後,才可以在該物件上進行方法呼叫,而static方法呼叫時不需要建立物件,可以直接呼叫。也就是說,當一個static方法被呼叫時,可能還沒有建立任何例項物件,如果從一個static方法中發出對非static方法的呼叫,那個非static方法是關聯到哪個物件上的呢?這個邏輯無法成績,所以,一個static方法內部不能發出對非static方法的呼叫。
非static方法可以訪問static方法, static方法不能訪問非static方法。
5. "=="和equals方法究竟有什麼區別?
==如果判斷值型別的話,判斷內容是否相同。如果判斷引用型別則是判斷記憶體地址是否相同。
equals是非常重要的一個方法。一般equals和==是不一樣的,但是在Object中兩者是一樣的。子類一般都要重寫這個方法。
6. Integer與int的區別
Integer是引用型別,預設值是null。而int是值型別,預設值是0
7. 作用域public,private,protected以及不寫時的區別
這四個作用域的可見範圍如下所示:
說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly
作用域 當前類 同一包(package) 子孫類 其他包(package)
public 可見 可見 可見 可見
protected 可見 可見 可見 不可見
friendly 可見 可見 不可見 不可見
private 可見 不可見 不可見 不可見
8. 過載與重寫區別?
過載是同一個類中,方法名稱相同,但是引數或個數不同,與返回值沒有關係。
重寫是在多個類中,產生繼承關係。父類與子類的方法必須相同。
9. 介面與抽象類的區別?
區別:(1)定義介面的關鍵字是:interface,而定義抽象類的關鍵字是:abstract ;
(2)介面中成員不能有私有,抽象類可以;
(3)介面中定義的成員,是final public static型別,抽象類沒有;
(4)介面中不能有普通方法,抽象類可以。
相同:兩個都不new。 但是介面與抽象類是面向物件必備知識,設計模式、重構程式碼有必然作用
10. final,finally,finalize的區別
final用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內部類要訪問區域性變數,區域性變數必須定義成final型別。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。JVM不保證此方法總被呼叫。
11. String、StringBuffer與StringBuilder的區別
String 字串常量;StringBuffer字串變數(執行緒安全);StringBuilder字串變數(非執行緒安全)
12. 所有的類都繼承於Object類,你用過的Object類的直接子類有哪些?Object類常用的方法有哪些?
(1) clone()方法
保護方法,實現物件的淺複製,只有實現了Cloneable接口才可以呼叫該方法,否則丟擲CloneNotSupportException異常。
(2) getClass()方法
final方法,獲得執行時的類
(3) toString()方法
該方法用的比較多,一般子類都有覆蓋
(4) finalize()方法
該方法用於釋放資源。因為無法確定該方法什麼時候被呼叫,很少使用。
13. 陣列有沒有length()方法? String有沒有length()這個方法?
陣列沒有length()這個方法,有length屬性。String有length()這個方法。
14. hashCode方法
該方法用於雜湊查詢,重寫了equals方法一般都要重寫hashCode方法。這個方法在一些具有雜湊功能的Collection中用到。一般用於滿足obj1.equals(obj2)==true。可以推出obj1.hashCode()==obj2.hashCode(),但是hashCode相等不一定就滿足equals。不過為了提高效率,應該儘量使上面兩個條件接近等價。
15. wait方法
wait方法就是使當前執行緒等待該物件的鎖,當前執行緒必須是該物件的擁有者,也就是具有該物件的鎖。wait()方法一直等待,直到獲得鎖或者被中斷。wait(long time)設定一個超時間隔,如果在規定時間內沒有獲得鎖就返回。呼叫該方法後當前執行緒進入睡眠狀態,直到以下事件發生:
(1)其他執行緒呼叫了該物件的notify方法
(2)其他執行緒呼叫了該物件的notifyAll方法
(3)其他執行緒呼叫了interrupt中斷該執行緒
(4)時間間隔到了
此時該執行緒就可以被排程了,如果是被中斷的話就丟擲一個InterruptedException異常。
16. notify方法
該方法喚醒在該物件上等待的某個執行緒
17. notifyAll方法
該方法喚醒在該物件上等待的所有執行緒
18. 反射的優缺點?
反射:就是正在執行動態讀取這個類的完整資訊。
優點:(1)能夠執行時獲取類的例項,大大提高系統的靈活性和擴充套件性
(2)與Java動態編譯相結合,可以實現無比強大的功能
缺點:(1)使用反射的效能較低
(2)使用反射相對來說不安全
(3)破壞了類的封裝性,可以通過反射獲取這個類的私有方法和屬性
由於欄位和方法接入時要遠慢於直接程式碼,因此反射機制主要應用在對靈活性和擴充套件性要求很高的系統框架上,普通程式不建議使用。
19. 執行時異常與一般異常有何異同?
異常表示程式 執行過程中可能出現的非正常狀態,執行時異常表示虛擬機器的通常操作中可能遇到的異常,是一種常見執行錯去。java編譯器要求方法必須宣告丟擲可能發生的非執行時異常,但是並不要求必須宣告丟擲去未被捕獲的執行時異常。