1. 程式人生 > 其它 >Java面試題(九)

Java面試題(九)

1.int 和Integer 有什麼區別?

Java是一個近乎純潔的面向物件程式語言,但是為了程式設計的方便還是引入不是物件的基本資料型別,但是為了能夠將 這些基本資料型別當成物件操作,Java為每一個基本資料型別都引入了對應的包裝型別(wrapper class),int的包 裝類就是Integer,從JDK 1.5開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。 Java 為每個原始型別提供了包裝型別: 原始型別: boolean,char,byte,short,int,long,float,double 包裝型別:Boolean,Character,Byte,Short,Integer,Long,Float,Double

public static void main(String[] args) {
    Integer a = new Integer(3);
    Integer b = 3; // 將3自動裝箱成Integer型別
    int c = 3;
    System.out.println(a == b); // false 兩個引用沒有引用同一物件
    System.out.println(a == c); // true a自動拆箱成int型別再和c比較
}
public static void main(String[] args) {
    Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
    System.out.println(f1 == f2);//true
    System.out.println(f3 == f4);//false
}

 2. swtich 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?

早期的JDK中,switch(expr)中,expr可以是byte、short、char、int。從1.5版開始,Java中引入了列舉型別 (enum),expr也可以是列舉,從JDK 1.7版開始,還可以是字串(String)。長整型(long)是不可以的。

3.在Java 中,如何跳出當前的多重巢狀迴圈?

在最外層迴圈前加一個標記如A,然後用break A;可以跳出多重迴圈。

4.構造器(constructor)是否可被重寫(override)?

構造器不能被繼承,因此不能被重寫,但可以被過載。

5.兩個物件值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

不對,如果兩個物件x和y滿足x.equals(y) == true,它們的雜湊碼(hash code)應當相同。

Java對於eqauls方 法和hashCode方法是這樣規定的:

(1)如果兩個物件相同(equals方法返回true),那麼它們的hashCode值一定要 相同;

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

實現高質量的equals方法的訣竅包括:

1. 使用==操作符檢查“引數是否為這個物件的引用”;

2. 使用instanceof操作符檢查“引數是否為正確的型別”;

3. 對於類中的關鍵屬性,檢查引數傳入物件的屬性是否與之相匹配;

4. 編寫完equals方法後,問自己它是否滿足對稱性、傳遞性、一致性;

5. 重寫equals時總是要重寫hashCode;

6. 不要將equals方法引數中的Object物件替換為其他的型別,在重寫時不要忘掉@Override註解。

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

是值傳遞。 Java 程式語言只有值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是對該物件的引用。

物件的屬性可以在被呼叫過程中被改變,但物件的引用是永遠不會改變的。

7.華為的面試題中曾經問過這樣一個問題:為什麼不能根據返回型別來區分過載?

方法的過載,即使返回值型別不同,也不能改變實現功能相同或類似這一既定事實;同時方法的過載只是要求兩同三 不同,即在同一個類中,相同的方法名稱,引數列表當中的引數型別、個數、順序不同;跟許可權修飾符和返回值類無 關

8.抽象的(abstract)方法是否可同時是靜態的(static),是否可同時是本地方法 (native),是否可同時被synchronized修飾?

都不能。

1.抽象方法需要子類重寫,而靜態的方法是無法被重寫的,因此二者是矛盾的。

2.本地方法是由原生代碼(如C程式碼)實 現的方法,而抽象方法是沒有實現的,也是矛盾的。

3.synchronized和方法的實現細節有關,抽象方法不涉及實現細 節,因此也是相互矛盾的。

9.靜態變數和例項變數的區別?

靜態變數是被static修飾符修飾的變數,也稱為類變數,它屬於類,不屬於類的任何一個物件,一個類不管建立多少 個物件,靜態變數在記憶體中有且僅有一個拷貝;

例項變數必須依存於某一例項,需要先建立物件然後通過物件才能訪 問到它,靜態變數可以實現讓多個物件共享記憶體。

兩者的相同點:都有預設值而且在類的任何地方都可以呼叫。在Java開發中,上下文類和工具類中通常會有大量的靜 態成員。

10.是否可以從一個靜態(static)方法內部發出對非靜態(non-static)方法的呼叫?

不可以,靜態方法只能訪問靜態成員,因為非靜態方法的呼叫要先建立物件,因此在呼叫靜態方法時可能物件並沒有 被初始化。