雲時代架構閱讀筆記十五——以前碰到的Java面試題

一、一個".java"源文件中是否能夠包括多個類(不是內部類)?有什麼限制? 

  能夠有多個類,但只能有一個public的類,而且public的類名必須與文件名相一致。html

二、Java有沒有goto? 

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

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

  &和&&均可以用做邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都爲true時,整個運算結果才爲true,不然,只要有一方爲false,則結果爲false。web

  &&還具備短路的功能,即若是第一個表達式爲false,則再也不計算第二個表達式,例如,對於if(str != null && !str.equals(「」))表達式,當str爲null時,後面的表達式不會執行,因此不會出現NullPointerException若是將&&改成&,則會拋出NullPointerException異常。If(x==33 & ++y>0) y會增加,If(x==33 && ++y>0)不會增加spring

  &還能夠用做位運算符,當&操做符兩邊的表達式不是boolean類型時,&表示按位與操做,咱們一般使用0x0f來與一個整數進行&運算,來獲取該整數的最低4個bit位,例如,0x31 & 0x0f的結果爲0x01。 數據庫

四、switch語句可否做用在byte上,可否做用在long上,可否做用在String上? 

  在switch(expr1)中,expr1只能是一個整數表達式或者枚舉常量,整數表達式能夠是int基本類型或Integer包裝類型,因爲,byte,short,char均可以隱含轉換爲int,因此,這些類型以及這些類型的包裝類型也是能夠的。顯然,long和String類型都不符合switch的語法規定,而且不能被隱式轉換成int類型,因此,它們不能做用於swtich語句中。 編程

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

  對於short s1 = 1; s1 = s1 + 1; 因爲s1+1運算時會自動提高表達式的類型,因此結果是int型,再賦值給short類型s1時,編譯器將報告須要強制轉換類型的錯誤。bootstrap

  對於short s1 = 1; s1 += 1;因爲 += 是java語言規定的運算符,java編譯器會對它進行特殊處理,所以能夠正確編譯。 設計模式

六、char型變量中能不能存貯一箇中文漢字?爲何? 

  char型變量是用來存儲Unicode編碼的字符的,unicode編碼字符集中包含了漢字,因此,char型變量中固然能夠存儲漢字啦。不過,若是某個特殊的漢字沒有被包含在unicode編碼字符集中,那麼,這個char型變量中就不能存儲這個特殊漢字。補充說明:unicode編碼佔用兩個字節,因此,char類型的變量也是佔用兩個字節。mvc

七、使用final關鍵字修飾一個變量時,是引用不能變,仍是引用的對象不能變? 

  使用final關鍵字修飾一個變量時,是指引用變量不能變,引用變量所指向的對象中的內容仍是能夠改變的app

  例如,對於以下語句:

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

    a=new StringBuffer("");
  可是,執行以下語句則能夠經過編譯:

    a.append(" broken!"); 

  有人在定義方法的參數時,可能想採用以下形式來阻止方法內部修改傳進來的參數對象:

    public void method(final  StringBuffer  param){

    } 

  實際上,這是辦不到的,在該方法內部仍然能夠增長以下代碼來修改參數對象:

    param.append("a");

八、"=="和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方法,由你本身寫代碼來決定在什麼狀況便可認爲兩個對象的內容是相同的。

九、靜態變量和實例變量的區別?

  在語法定義上的區別:靜態變量前要加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);

  }

}

十、是否能夠從一個static方法內部發出對非static方法的調用?

  不能夠。由於非static方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方法內部不能夠發出對非static方法的調用

十一、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中還定義了表示整數的最大值和最小值的常量。

十二、請說出做用域public,private,protected,以及不寫時的區別

這四個做用域的可見範圍以下表所示。

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

1三、Overload和Override的區別。Overloaded的方法是否能夠改變返回值的類型? 

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

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

  重寫Override表示子類中的方法能夠與父類中的某個方法的名稱和參數徹底相同,經過子類建立的實例對象調用這個方法時,將調用子類中的定義方法,這至關於把父類中定義的那個徹底相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,由於子類能夠解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。若是父類的方法是private類型,那麼,子類則不存在覆蓋的限制,至關於子類中增長了一個全新的方法。

  至於Overloaded的方法是否能夠改變返回值的類型這個問題,要看你倒底想問什麼呢?這個題目很模糊。若是幾個Overloaded的方法的參數列表不同,它們的返回者類型固然也能夠不同。但我估計你想問的問題是:若是兩個方法的參數列表徹底同樣,是否可讓它們的返回值不一樣來實現重載Overload?這是不行的,咱們能夠用反證法來講明這個問題,由於咱們有時候調用一個方法時也能夠不定義返回結果變量,即不要關心其返回結果,例如,咱們調用map.remove(key)方法時,雖然remove方法有返回值,可是咱們一般都不會定義接收返回結果的變量,這時候假設該類中有兩個名稱和參數列表徹底相同的方法,僅僅是返回類型不一樣,java就沒法肯定編程者倒底是想調用哪一個方法了,由於它沒法經過返回結果類型來判斷。 

  override能夠翻譯爲覆蓋,從字面就能夠知道,它是覆蓋了一個方法而且對其重寫,以求達到不一樣的做用。對咱們來講最熟悉的覆蓋就是對接口方法的實現,在接口中通常只是對方法進行了聲明,而咱們在實現時,就須要實現接口聲明的全部方法。除了這個典型的用法之外,咱們在繼承中也可能會在子類覆蓋父類中的方法,在覆蓋要注意如下的幾點:

  一、覆蓋的方法的標誌必需要和被覆蓋的方法的標誌徹底匹配,才能達到覆蓋的效果;

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

  三、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;

  四、被覆蓋的方法不能爲private,不然在其子類中只是新定義了一個方法,並無對其進行覆蓋。

  overload對咱們來講可能比較熟悉,能夠翻譯爲重載,它是指咱們能夠定義一些名稱相同的方法,經過定義不一樣的輸入參數來區分這些方法,而後再調用時,VM就會根據不一樣的參數樣式,來選擇合適的方法執行。在使用重載要注意如下的幾點:

  1. 在使用重載時只能經過不一樣的參數樣式。例如,不一樣的參數類型,不一樣的參數個數,不一樣的參數順序(固然,同一方法內的幾個參數類型必須不同,例如能夠是fun(int,float),可是不能爲fun(int,int));
  2. 不能經過訪問權限、返回類型、拋出的異常進行重載;
  3. 方法的異常類型和數目不會對重載形成影響;
  4. 對於繼承來講,若是某一方法在父類中是訪問權限是priavte,那麼就不能在子類對其進行重載,若是定義的話,也只是定義了一個新方法,而不會達到重載的效果。

1四、has a與is a的區別

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

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

1五、ClassLoader如何加載class?

  jvm裏有多個類加載器,每一個類加載器能夠負責加載特定位置的類,例如,bootstrap類加載負責加載jre/lib/rt.jar中的類, 咱們平時用的jdk中的類都位於rt.jar中。extclassloader負責加載jar/lib/ext/*.jar中的類,appclassloader負責classpath指定的目錄或jar中的類除了bootstrap以外,其餘的類加載器自己也都是java類,它們的父類是ClassLoader。

1六、分層設計的好處

  把各個功能按調用流程進行了模塊化,模塊化帶來的好處就是能夠隨意組合,舉例說明:若是要註冊一個用戶,流程爲顯示界面並經過界面接收用戶的輸入,接着進行業務邏輯處理,在處理業務邏輯又訪問數據庫,若是咱們將這些步驟所有按流水賬的方式放在一個方法中編寫,這也是能夠的,但這其中的壞處就是,當界面要修改時,因爲代碼全在一個方法內,可能會碰壞業務邏輯和數據庫訪問的碼,一樣,當修改業務邏輯或數據庫訪問的代碼時,也會碰壞其餘部分的代碼。分層就是要把界面部分、業務邏輯部分、數據庫訪問部分的代碼放在各自獨立的方法或類中編寫,這樣就不會出現牽一髮而動全身的問題了。這樣分層後,還能夠方便切換各層,譬如原來的界面是Swing,如今要改爲BS界面,若是最初是按分層設計的,這時候不須要涉及業務和數據訪問的代碼,只需編寫一條web界面就能夠了。

  分層的好處:

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

  2.便於進行分工

  3.便於維護

  4.提升軟件組件的重用

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

  6.便於產品功能的擴展。

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

1七、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個對象是否相等,用==就能夠了,若是兩個對象的物理(內存)地址相等,那麼這兩個對象確定就是同一個對象。

1八、什麼是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的處理過程:首先控制器接受用戶的請求,調用相應的模型來進行業務處理,並返回數據給控制器。控制器調用相應的視圖來顯示處理的結果。並經過視圖呈現給用戶。

轉自:http://www.javashuo.com/article/p-ywmwicxj-a.html

相關文章
相關標籤/搜索