面試題收集——Java基礎部分(一)

weixin_34391854發表於2017-01-19

1、一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制? 

  可以有多個類,但只能有一個public的類,並且public的類名必須與檔名相一致。

2、Java有沒有goto? 

  java中的保留字,現在沒有在java中使用。

3、說說&和&&的區別。 

  &和&&都可以用作邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。

  &&還具有短路的功能,即如果第一個表示式為false,則不再計算第二個表示式,例如,對於if(str != null && !str.equals(“”))表示式,當str為null時,後面的表示式不會執行,所以不會出現NullPointerException如果將&&改為&,則會丟擲NullPointerException異常。If(x==33 & ++y>0) y會增長,If(x==33 && ++y>0)不會增長

  &還可以用作位運算子,當&操作符兩邊的表示式不是boolean型別時,&表示按位與操作,我們通常使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果為0x01。 

4、switch語句能否作用在byte上,能否作用在long上,能否作用在String上? 

  在switch(expr1)中,expr1只能是一個整數表示式或者列舉常量,整數表示式可以是int基本型別或Integer包裝型別,由於,byte,short,char都可以隱含轉換為int,所以,這些型別以及這些型別的包裝型別也是可以的。顯然,long和String型別都不符合switch的語法規定,並且不能被隱式轉換成int型別,所以,它們不能作用於swtich語句中。 

5、short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯? 

  對於short s1 = 1; s1 = s1 + 1; 由於s1+1運算時會自動提升表示式的型別,所以結果是int型,再賦值給short型別s1時,編譯器將報告需要強制轉換型別的錯誤。

  對於short s1 = 1; s1 += 1;由於 += 是java語言規定的運算子,java編譯器會對它進行特殊處理,因此可以正確編譯。 

6、char型變數中能不能存貯一箇中文漢字?為什麼? 

  char型變數是用來儲存Unicode編碼的字元的,unicode編碼字符集中包含了漢字,所以,char型變數中當然可以儲存漢字啦。不過,如果某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變數中就不能儲存這個特殊漢字。補充說明:unicode編碼佔用兩個位元組,所以,char型別的變數也是佔用兩個位元組。

7、使用final關鍵字修飾一個變數時,是引用不能變,還是引用的物件不能變? 

  使用final關鍵字修飾一個變數時,是指引用變數不能變,引用變數所指向的物件中的內容還是可以改變的

  例如,對於如下語句:

     final StringBuffer a=new StringBuffer("immutable");
  執行如下語句將報告編譯期錯誤:

    a=new StringBuffer("");
  但是,執行如下語句則可以通過編譯:

    a.append(" broken!"); 

  有人在定義方法的引數時,可能想採用如下形式來阻止方法內部修改傳進來的引數物件:

    public void method(final  StringBuffer  param){

    } 

  實際上,這是辦不到的,在該方法內部仍然可以增加如下程式碼來修改引數物件:

    param.append("a");

8、"=="和equals方法究竟有什麼區別?

  “==”操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是否相等,只能用==操作符。

  如果一個變數指向的資料是物件型別的,那麼,這時候涉及了兩塊記憶體,物件本身佔用一塊記憶體(堆記憶體),變數也佔用一塊記憶體(棧記憶體),例如Objet obj = new Object();變數obj是一個記憶體,new Object()是另一個記憶體,此時,變數obj所對應的記憶體中儲存的數值就是物件佔用的那塊記憶體的首地址。對於指向物件型別的變數,如果要比較兩個變數是否指向同一個物件,即要看這兩個變數所對應的記憶體中的數值是否相等,這時候就需要用==操作符進行比較

  equals方法是用於比較兩個獨立物件的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個物件是獨立的。例如,對於下面的程式碼:

  String a=new String("foo");

  String b=new String("foo");

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

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

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

  boolean equals(Object o){

    return this==o;

  }

  這說明,如果一個類沒有自己定義equals方法,它預設的equals方法(從Object 類繼承的)就是使用==操作符,也是在比較兩個變數指向的物件是否是同一物件,這時候使用equals和使用==會得到同樣的結果,如果比較的是兩個獨立的物件則總返回false。如果你編寫的類希望能夠比較該類建立的兩個例項物件的內容是否相同,那麼你必須覆蓋equals方法,由你自己寫程式碼來決定在什麼情況即可認為兩個物件的內容是相同的。

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

  在語法定義上的區別:靜態變數前要加static關鍵字,而例項變數前則不加

  在程式執行時的區別:例項變數屬於某個物件的屬性,必須建立了例項物件,其中的例項變數才會被分配空間,才能使用這個例項變數靜態變數不屬於某個例項物件,而是屬於類,所以也稱為類變數,只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。總之,例項變數必須建立物件後才可以通過這個物件來使用,靜態變數則可以直接使用類名來引用。

  例如,對於下面的程式,無論建立多少個例項物件,永遠都只分配了一個staticVar變數,並且每建立一個例項物件,這個staticVar就會加1;但是,每建立一個例項物件,就會分配一個instanceVar,即可能分配多個instanceVar,並且每個instanceVar的值都只自加了1次。

public class VariantTest{

  public static int staticVar = 0; 

  public int instanceVar = 0; 

  public VariantTest(){

    staticVar++;

    instanceVar++;

    System.out.println(“staticVar=” + staticVar + ”,instanceVar=” + instanceVar);

  }

}

10、是否可以從一個static方法內部發出對非static方法的呼叫?

  不可以。因為非static方法是要與物件關聯在一起的,必須建立一個物件後,才可以在該物件上進行方法呼叫,而static方法呼叫時不需要建立物件,可以直接呼叫。也就是說,當一個static方法被呼叫時,可能還沒有建立任何例項物件,如果從一個static方法中發出對非static方法的呼叫,那個非static方法是關聯到哪個物件上的呢?這個邏輯無法成立,所以,一個static方法內部不可以發出對非static方法的呼叫

11、Integer與int的區別

  int是java提供的8種原始資料型別之一。Java為每個原始型別提供了封裝類,Integer是java為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中還定義了表示整數的最大值和最小值的常量。

12、請說出作用域public,private,protected,以及不寫時的區別

這四個作用域的可見範圍如下表所示。

說明:如果在修飾的元素上面沒有寫任何訪問修飾符,則表示friendly。

13、Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別? 

  Overload是過載的意思,Override是覆蓋的意思,也就是重寫

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

  重寫Override表示子類中的方法可以與父類中的某個方法的名稱和引數完全相同,通過子類建立的例項物件呼叫這個方法時,將呼叫子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是物件導向程式設計的多型性的一種表現。子類覆蓋父類的方法時,只能比父類丟擲更少的異常,或者是丟擲父類丟擲的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問許可權只能比父類的更大,不能更小。如果父類的方法是private型別,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。

  至於Overloaded的方法是否可以改變返回值的型別這個問題,要看你倒底想問什麼呢?這個題目很模糊。如果幾個Overloaded的方法的引數列表不一樣,它們的返回者型別當然也可以不一樣。但我估計你想問的問題是:如果兩個方法的引數列表完全一樣,是否可以讓它們的返回值不同來實現過載Overload?這是不行的,我們可以用反證法來說明這個問題,因為我們有時候呼叫一個方法時也可以不定義返回結果變數,即不要關心其返回結果,例如,我們呼叫map.remove(key)方法時,雖然remove方法有返回值,但是我們通常都不會定義接收返回結果的變數,這時候假設該類中有兩個名稱和引數列表完全相同的方法,僅僅是返回型別不同,java就無法確定程式設計者倒底是想呼叫哪個方法了,因為它無法通過返回結果型別來判斷。 

  override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法並且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對介面方法的實現,在介面中一般只是對方法進行了宣告,而我們在實現時,就需要實現介面宣告的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法,在覆蓋要注意以下的幾點:

  1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;

  2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;

  3、覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類;

  4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

  overload對我們來說可能比較熟悉,可以翻譯為過載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入引數來區分這些方法,然後再呼叫時,VM就會根據不同的引數樣式,來選擇合適的方法執行。在使用過載要注意以下的幾點:

  1. 在使用過載時只能通過不同的引數樣式。例如,不同的引數型別,不同的引數個數,不同的引數順序(當然,同一方法內的幾個引數型別必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
  2. 不能通過訪問許可權、返回型別、丟擲的異常進行過載;
  3. 方法的異常型別和數目不會對過載造成影響;
  4. 對於繼承來說,如果某一方法在父類中是訪問許可權是priavte,那麼就不能在子類對其進行過載,如果定義的話,也只是定義了一個新方法,而不會達到過載的效果。

14、has a與is a的區別

  is-a表示的是屬於的關係。比如兔子屬於一種動物(繼承關係)。

  has-a表示組合,包含關係。比如兔子包含有腿,頭等元件。

15、ClassLoader如何載入class?

  jvm裡有多個類載入器,每個類載入器可以負責載入特定位置的類,例如,bootstrap類載入負責載入jre/lib/rt.jar中的類, 我們平時用的jdk中的類都位於rt.jar中。extclassloader負責載入jar/lib/ext/*.jar中的類,appclassloader負責classpath指定的目錄或jar中的類除了bootstrap之外,其他的類載入器本身也都是java類,它們的父類是ClassLoader。

16、分層設計的好處

  把各個功能按呼叫流程進行了模組化,模組化帶來的好處就是可以隨意組合,舉例說明:如果要註冊一個使用者,流程為顯示介面並通過介面接收使用者的輸入,接著進行業務邏輯處理,在處理業務邏輯又訪問資料庫,如果我們將這些步驟全部按流水帳的方式放在一個方法中編寫,這也是可以的,但這其中的壞處就是,當介面要修改時,由於程式碼全在一個方法內,可能會碰壞業務邏輯和資料庫訪問的碼,同樣,當修改業務邏輯或資料庫訪問的程式碼時,也會碰壞其他部分的程式碼。分層就是要把介面部分、業務邏輯部分、資料庫訪問部分的程式碼放在各自獨立的方法或類中編寫,這樣就不會出現牽一髮而動全身的問題了。這樣分層後,還可以方便切換各層,譬如原來的介面是Swing,現在要改成BS介面,如果最初是按分層設計的,這時候不需要涉及業務和資料訪問的程式碼,只需編寫一條web介面就可以了。

  分層的好處:

  1.實現了軟體之間的解耦;

  2.便於進行分工

  3.便於維護

  4.提高軟體元件的重用

  5.便於替換某種產品,比如持久層用的是hibernate,需要更換產品用toplink,就不用該其他業務程式碼,直接把配置一改。

  6.便於產品功能的擴充套件。

  7.便於適用使用者需求的不斷變化

17、hashCode方法的作用?

  hashcode這個方法是用來鑑定2個物件是否相等的。

  equals方法和hashCode方法這2個方法都是用來判斷2個物件是否相等的,但是他們是有區別的。

  一般來講,equals這個方法是給使用者呼叫的,如果你想判斷2個物件是否相等,你可以重寫equals方法,然後在程式碼中呼叫,就可以判斷他們是否相等了。簡單來講,equals方法主要是用來判斷從表面上看或者從內容上看,2個物件是不是相等。舉個例子,有個學生類,屬性只有姓名和性別,那麼我們可以認為只要姓名和性別相等,那麼就說這2個物件是相等的。

  hashcode方法一般使用者不會去呼叫,比如在hashmap中,由於key是不可以重複的,他在判斷key是不是重複的時候就判斷了hashcode這個方法,而且也用到了equals方法。這裡不可以重複是說equals和hashcode只要有一個不等就可以了!所以簡單來講,hashcode相當於是一個物件的編碼,就好像檔案中的md5,他和equals不同就在於他返回的是int型的,比較起來不直觀。我們一般在覆蓋equals的同時也要覆蓋hashcode,讓他們的邏輯一致。舉個例子,還是剛剛的例子,如果姓名和性別相等就算2個物件相等的話,那麼hashcode的方法也要返回姓名的hashcode值加上性別的hashcode值,這樣從邏輯上,他們就一致了。

  要從物理上判斷2個物件是否相等,用==就可以了,如果兩個物件的物理(記憶體)地址相等,那麼這兩個物件肯定就是同一個物件。

18、什麼是AOP?

1.AOP概念介紹

  所謂AOP,即Aspect orientied program,就是面向方面(切面)的程式設計。

  面向切面程式設計Aspect-Orlented-Programming,即AOP是對物件導向的思維方式的有力補充。

  AOP的好處是可以動態地新增和刪除在切面上的邏輯而不影響原來的執行程式碼

2.解釋什麼是方面(切面)

  所謂方面(切面)指的是貫穿到系統的各個模組中的系統一個功能就是一個方面(切面),比如,記錄日誌,統一異常處理,事務處理,許可權檢查,這些功能都是軟體系統的一個面,而不是一點,在各個模組中都要出現。

3.什麼是面向方面程式設計

  把系統的一個方面的功能封裝成物件的形式來處理就是面向方面(切面)程式設計

4.怎麼進行面向方面程式設計

  把功能模組對應的物件作為切面嵌入到原來的各個系統模組中,採用代理技術,代理會呼叫目標,同時把切面功能的程式碼(物件)加入進來。所以,用spring配置代理物件時只要要配兩個屬性,分別表示目標和切面物件(Advisor)。

 19.談談你對mvc的理解

  MVC是Model—View—Controler的簡稱。即模型—檢視—控制器。MVC是一種設計模式,它強制性的把應用程式的輸入、處理和輸出分開。

  MVC中的模型、檢視、控制器它們分別擔負著不同的任務。

  • 檢視: 檢視是使用者看到並與之互動的介面。檢視向使用者顯示相關的資料,並接受使用者的輸入。檢視不進行任何業務邏輯處理。
  • 模型: 模型表示業務資料和業務處理。相當於JavaBean。一個模型能為多個檢視提供資料。這提高了應用程式的重用性
  • 控制器: 當使用者單擊Web頁面中的提交按鈕時,控制器接受請求並呼叫相應的模型去處理請求。然後根據處理的結果呼叫相應的檢視來顯示處理的結果。

  MVC的處理過程:首先控制器接受使用者的請求,呼叫相應的模型來進行業務處理,並返回資料給控制器。控制器呼叫相應的檢視來顯示處理的結果。並通過檢視呈現給使用者。

  IT公司面試手冊:http://www.mianwww.com/

相關文章