1. 程式人生 > 其它 >面試彙總7.10

面試彙總7.10

1. 若對一個類不重寫,它的equals()方法是如何比較的?

比較是物件的地址。

2. 請解釋hashCode()和equals()方法有什麼聯絡?

Java物件的equals方法和hashCode方法是這樣規定的:

l 相等(相同)的物件必須具有相等的雜湊碼(或者雜湊碼)

l 如果兩個物件的hashCode相同,它們並不一定相同。

3. 請解釋Java中的概念,什麼是建構函式?什麼是建構函式過載?什麼複製建構函式?

當新物件唄建立的時候,建構函式會被呼叫。每一個都有建構函式。在程式設計師沒有給類提供建構函式的情況下,Java編譯器會為這個類建立一個預設的建構函式。

Java中建構函式過載和方法過載很相似。可以為一個類建立多個建構函式。每一個建構函式必須有它自己唯一的引數列表。

Java不支援像C++中那樣的複製建構函式,這個不同點是因為如果你不自己寫建構函式的情況下,Java不會建立預設的複製建構函式。

4. 請說明Java中的方法覆蓋(Overriding)和方法過載(Overloading)是什麼意思?

Java中的方法過載發生在同一個類裡面兩個或者多個方法的方法名相同但是引數列表不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,引數列表和返回型別。覆蓋者可能不會限值它所覆蓋的方法的訪問。

5. 請說明Query介面的list方法和iterate方法有什麼區別?

list()方法無法利用一級快取和二級快取(對快取只寫不讀),它只能在開啟查詢快取的前提下使用查詢快取;iterate()方法可以充分利用快取,如果目標資料只讀或者讀取頻繁,使用iterate()方法可以減少效能開銷。
list()方法不會引起N+1查詢問題,而iterate()方法可能引起N+1查詢問題。

6. 請說明如何通過反射獲取好設定物件私有欄位的值?

可以通過類物件的getDeclaredField()方法欄位(Field)物件,然後再通過欄位物件的setAccessible(true)將其設定為可以訪問,接下來就可以通過get/set方法來獲取/設定欄位的值了。下面的程式碼實現了一個反射的工具類,其中的兩個靜態方法分別用於獲取和設定私有欄位的值,欄位可以是基本型別也可以是物件型別且支援多級物件操作,例如ReflectionUtil.get(dog, "owner.car.engine.id");可以獲得dog物件的主人的汽車的引擎的ID號。

import java.lang.reflect.Method;

class MethodInvokeTest {

public static void main(String[] args) throws Exception {

String str = "hello";

Method m = str.getClass().getMethod("toUpperCase");

System.out.println(m.invoke(str)); // HELLO

}

}

7. 請判斷,兩個物件值相同(x.equals(y)==true),但卻可有不同的hashCode,該說明是否正確,為什麼?

不對,如果兩個物件x和y滿足x.equals(y) == true,它們的雜湊碼(hash code)應當相同。Java對於eqauls方法和hashCode方法是這樣規定的:(1)如果兩個物件相同(equals方法返回true),那麼它們的hashCode值一定要相同;(2)如果兩個物件的hashCode相同,它們並不一定相同。當然,你未必要按照要求去做,但是如果你違背了上述原則就會發現在使用容器時,相同的物件可以出現在Set集合中,同時增加新元素的效率會大大下降(對於使用雜湊儲存的系統,如果雜湊碼頻繁的衝突將會造成存取效能急劇下降)。

8. 請說明內部類可以引用它包含類的成員嗎,如果可以,有沒有什麼限制嗎?

一個內部類物件可以訪問建立它的外部類物件的內容,內部類如果不是static的,那麼它可以訪問建立它的外部類物件的所有屬性內部類如果是sattic的,即為nested class,那麼它只可以訪問建立它的外部類物件的所有static屬性一般普通類只有public或package的訪問修飾,而內部類可以實現static,protected,private等訪問修飾。當從外部類繼承的時候,內部類是不會被覆蓋的,它們是完全獨立的實體,每個都在自己的名稱空間內,如果從內部類中明確地繼承,就可以覆蓋原來內部類的方法。

9. 請說明Java語句如何進行異常處理關鍵字:throws、throw、try、catch、finally分別代表什麼意義?在try塊種可以丟擲異常嗎?

Java 通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java中,每個異常都是一個物件,它是Throwable類或其它子類的例項。當一個方法出現異常後便丟擲一個異常物件,該物件中包含有異常資訊,呼叫這個物件的方法可以捕獲到這個異常並進行處理。Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程式,如果出現異常,系統會丟擲(throws)一個異常,這時候你可以通過它的型別來捕捉(catch)它,或最後(finally)由預設處理器來處理。用try來指定一塊預防所有”異常”的程式。緊跟在try程式後面,應包含一個catch子句來指定你想要捕捉的”異常”的型別。throw語句用來明確地丟擲一個”異常”。throws用來標明一個成員函式可能丟擲的各種”異常”。Finally為確保一段程式碼不管發生什麼”異常”都被執行一段程式碼。可以在一個成員函式呼叫的外面寫一個try語句,在這個成員函式內部寫另一個try語句保護其他程式碼。每當遇到一個try語句,”異常“的框架就放到堆疊上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種”異常”進行處理,堆疊就會展開,直到遇到有處理這種”異常”的try語句。

10. 請判斷當一個物件被當做引數傳遞給一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?

是值傳遞。Java 程式語言只有值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。物件的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的。

11. 請你說說Static Nested Class和Inner Class的不同?

Static Nested Class是被宣告為靜態(static)的內部類,它可以不依賴於外部類例項被例項化。而通常的內部類需要在外部類例項化後才能例項化。Static-Nested Class 的成員, 既可以定義為靜態的(static), 也可以定義為動態的(instance).Nested Class的靜態成員(Method)只能對Outer Class的靜態成員(static memebr)進行操作(ACCESS), 而不能Access Outer Class的動態成員(instance member).而 Nested Class的動態成員(instance method) 卻可以 Access Outer Class的所有成員, 這個概念很重要, 許多人對這個概念模糊.有一個普通的原則, 因為靜態方法(static method) 總是跟 CLASS 相關聯(bind CLASS), 而動態方法( (instance method) 總是跟 instance object 相關聯, 所以,靜態方法(static method)永遠不可以Access跟 object 相關的動態成員(instance member),反過來就可以, 一個CLASS的 instance object 可以 Access 這個 Class 的任何成員, 包括靜態成員(static member)