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