Java筆試面試題目(二)

每日一句:人生充滿着期待,夢想連接着未來!

java應屆生或自學初學者筆試面試題目總結,希望對大家有幫助,題目來自自己學習總結和老師講解,網絡資源,書籍資料。敲出來大家看,每次更新10+道題目,希望大家能找到一份好工作。

第一部分:基礎部分

基礎部分的包括:基本語法,類似相關的語法,內部類、繼承、異常、線程、集合、IO、虛擬機、其他。

11. “==”和equals方法有什麼區別
==操作符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操作符。

如果一個變量指向的數據是對象類型的,那麼,這個時候涉及了兩塊內存,對象本身佔用一塊內存(堆內存),變量也佔用一塊內存,例如Object obj = new Object();變量obj是一塊內存,new Object()是另一塊內存,此時,變量obj所對應的內存中存儲的數值就是對象佔用的那塊內存的首地址。對於指向對象類型的變量,如果要比較兩個變量是否指向同一個對象,既要看這兩個變量所對應的內存中的數值是否相等,這時候就需要用==操作符進行比較。

equals方法是用來比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相同,他比較的兩個對象是獨立的。例如,對於下面的代碼:

String a = new String("tumbler");
String b = new String("tumbler");

兩條new語句創建了兩個對象,然後用a,b這兩個變量分別指向了其中的一個對象,這是兩個不同的對象,他們的首地址是不同的,即a和b中存儲的值是不相同的,所以表達式a==b將返回false,而這兩個對象中的內容是相同的,所以,表達式a.equals(b)將返回true。

在實際開發中,我們經常要比較傳遞進來的字符串內容是否相等,例如,String input = ...; input.equals("tumbler"); 許多人稍不注意就寫成了==進行比較,這是錯誤的,字符串的比較基本都是用equals方法。

如果一個類沒有定義自己的equals方法,那麼它將繼承Object類的equals方法,Object類的equals方法實現如下:

boolean equals(Object o){
    return this == o;
}

這說明,如果一個類沒有自己定義的equals方法,它默認的equals方法就是使用==操作符,也就是在比較兩個變量指向的對象是否是同一對象,這時候使用equals和使用==會得到相同的結果,如果比較兩個獨立的對象,則總是返回false。如果你編寫的類希望能夠比較該類創建的兩個實例對象的內容是否相同,那麼你必須覆蓋equals方法。

## 12. 靜態變量和實例變量的區別
語法定義區別:靜態變量用static關鍵字修飾,而實例變量則不用。

程序運行時區別:實例變量屬於某個對象的屬性,必須創建了實例對象,其中的實例變量纔會被分配空間,才能使用這個實例變量。靜態變量不屬於某個對象,而是屬於類,所以也稱爲類變量,只要程序加載了類的字節碼,不用穿件任何實例對象,靜態變量就會被分配空間,就可以被使用。總之,實例變量必須創建對象後纔可以通過這個對象來使用,而靜態變量則可以直接使用類名來使用。

例如:對於下面的代碼,無論創建多少個實例對象,永遠都只會分配了一個staticVal變量,並且每創建一個實例對象,這個staticVal就會+1;但是,每創建一個實例對象,就會分配一個instanceVal,即可能分配多個instanceVal,並且每個instanceVal的值都只自加了一次。

public class VariantTest{
    public static int staticVal = 0;
    public int instanceVal = 0;
    public VariantTest(){
        staticVal++;
        instanceVal++;
        System.out.println("staticVal="+staticVal+",instanceVal="+instanceVal);
    }
}

13. 是否可以從一個static方法內部發出對非static方法的調用?
不可以。因爲非static方法是要與類對象關聯在一起使用,必須創建一個對象後,纔可以在該對象上進行方法的調用,而static方法調用時不需要創建對象,可以直接調用。也就是說,當一個static方法被調用,那個非static方法是關聯到哪個對象上的?邏輯無法成立,所以答案是不可以。

14. Integer與int的區別
int是java提供的8種原始數據類型之一。Java爲每一個原始類型提供了封裝類,Integer是int的封裝類。int的默認值是0,而Integer的默認值是null,即Integer可以區分出未賦值和值爲0的區別,int則無法表達出未賦值的情況,例如,想要表達出沒有參加考試和考試成績爲0的區別,則只能用Integer。在JSP開發中,Integer的默認爲null,所以用el表達式在文本框中顯示時,值爲空白字符串,而int默認值爲0,所以用el表達式在文本框中顯示時,結果爲0,所以,int不太適合作爲web層的表單數據的類型。

在Hibernate中,如果將OID定義爲Integer類型,那麼Hibernate就可以根據其值是否爲null而判斷一個對象是否是臨時的,如果將OID定義爲int類型,還需要在hbm映射文件中設置其unsaved-value屬性值爲0。

另外,Integer提供了多個與整數相關的操作方法,例如,將一個字符串轉換成整數,Integer中還定義了表示整數的最大值和最小值操作。

15. Math.round(11.5)等於?Math.round(-11.5)等於?
Math 提供了三種與取整有關的方法:ceil、floor、round,這些方法的作用與他們的英文名含義相近,例如:ceil(天花板),該方法就表示向上取整,所以,Math.ceil(11.3)結果爲12,Math.ceil(-11.3)的結果爲-11;floor(地板),Math.floor(11.6)=11,Math.floor(-11.6)=-12;round表示四捨五入,算法爲Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,Math.round(11.5)=12,Math.round(-11.5)=-11。

16. 下面的代碼有什麼錯誤?

1.if(username.equals("tumbler"){}
2.int x = 1;
  return x = 1?true:false

第一個缺少一個右括號;第二個正確;

17. 說出作用域public、private、protected以及不寫時的區別。
作用域 當前類 同一package 子孫類 其他package

作用域 當前類 同一package 子孫類 其他package
public
protected ×
friendly × ×
private × × ×

18. Overload和Override的區別,Overload的方法是否可以改變返回值的類型?
Overload是重載的意思,Override是重寫覆蓋的意思。

重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(參數個數或參數類型不同)。

重寫Override表示子類中的方法可以與父類中的方法名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中定義的方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種體現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出異常的子異常,因爲子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大不能更小。如果父類的方法時private修飾的,那麼,子類則不能覆蓋,相當於子類中增加了一個全新的方法。

19. 一個房子裏有椅子,椅子有腿和背,房子與椅子是什麼關係,椅子與腿和背是什麼關係?
如果房子有多個椅子,就是聚合關係,否則就是一種關聯關係,當然,聚合是一種特殊的關聯。椅子與腿和背是組合關係。

20. 說說is a和has a的區別。
is a表示的是屬於的關係。比如貓屬於一種動物(繼承關係)。

has a表示組合、包含關係。比如貓包含有腿、頭等組件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章