java基礎經典五十問

1、&和&&的區別。
答:&是位運算符,&&是布爾邏輯運算符。&也可用於邏輯運算,但是此時他不支持短路運算(即如果第一個變量的值爲false,他還會判斷第二個變量的bool值)

2、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
答:Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11.

3、抽象類是否必須要有抽象方法?

答:不是必須的。如果一個類有抽象方法,這個類必須是抽象類;但是如果一個類是抽象類,不一定有抽象方法。

4、java中的可變長參數一般用於什麼情況?注意事項是什麼?

答:可變長參數用於處理方法重載中,參數類型相同,個數不同的情況;這樣我們就免去寫大量重複代碼的麻煩!注意事項是:在一個方法中只能有一個可變長參數,而且,必須放在最後一個參數的位置!

5、能否用原始類型來實例化泛型?

答:不可以。如:GenList<int> nList = new GenList<int>(); //會產生編譯錯誤

6、泛型有沒有多態?

答:沒有多態。編譯類型的泛型和運行時類型的泛型一定要一致!
   List<Dog> as = new ArrayList<Dog>();
   List<Animal> l = as;  //error  Animal與Dog的父子關係不能推導出List<Animal> 與 List<Dog> 之間的父子類關係 

7、List, Set, Map是否繼承自Collection接口?
答:List、Set是而Map不是。

8、switch語句的參數需要滿足什麼條件?

答:參數必須爲byte、short、int或char類型(數據類型長度小於等於32位),在JDK5.0中可以是枚舉類型!

9、最有效率的算出2乘以8等於幾的算法?
答:2 << 3

10、兩個對象值相同(x.equals(y) == true),但卻可有不同的hashCode,這句話對不對?

答:不對!兩個對象如果滿足x.equals(y) == true,那麼一定滿足x.hashCode()==y.hashCode();

             但是如果兩個對象如果滿足x.hashCode()==y.hashCode(),那麼不一定滿足x.equals(y) == true;這是java規範中的定義,我們在定義自己的類的時候,很多情況下需要重寫equals()方法和hashCode()方法,必須滿足上面的規範。

11、java中有沒有引用傳遞?

答:沒有,java中只有值傳遞!雖然我們將一個“對象引用”作爲方法參數時,可以在方法中對該引用對應的對象進行修改,並返回給方法調用者,但是我們永遠無法改變這個引用本身的值!

12、try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,什麼時候被執行? 
答:會執行,在return前執行。但是如果此時在finally{}後還有語句,則這些語句不會再執行!

13、在try - catch 塊中遇到System.exit(0)還會不會執行finally中的代碼?

答:不會再執行!因爲exit(0)的作用是終止當前虛擬機!

14、當try後面有多個語句塊時,catch異常塊的順序應該遵循什麼原則?

答:必須保證子Exception類必須放在父Exception類的前面,這樣纔可能保證產生的每個異常能分別被捕捉到。也可由同一異常進行處理,前提是這個共用的異常應該是所有這些該被捕獲的異常的父類!

15、for-each語句是爲處理哪兩種類型提出的?

答: 數組和集合.利用該語句消除了程序員需要考慮數組和集合長度的麻煩!

16、int和String,Integer和String以及int和Integer相互轉化的方法分別是什麼?

答:int--------->String---------------------:靜態方法String.valueOf()

    String---------->int--------------------:靜態方法Integer.parseInt()

    Integer-------->String----------------:x.toString()方法//x爲一個Integer的實例

    String---------->Integer--------------:靜態方法Integer.valueOf()

    int-------------->Integer--------------:new Integer(int x)

    Integer-------->int--------------------:x.intValue()//其中x是一個Integer的實例

17、請對比一下ArrayList和LinkedList?

答:ArrayList    數組 查詢快 增刪操作慢
    LinkedList  鏈表 查詢慢 增刪操作快

18、先後執行下面三條語句int a=5;int b=a<<33;System.out.println(b);b的最終結果是多少?

答:結果b=10,移位運算時系統會以32爲基數對33求餘!

19、接口中是否可以有靜態方法?

答:不可以!

20、數組有沒有length()這個方法? String有沒有length()這個方法?
答:數組沒有length()這個方法,有length的屬性;String有length()這個方法。

21、abstract的method是否可以是static,native或synchronized修飾的?
答:都不能!

22、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其他方法?
答:視情況而定。
1、如果另一個方法是非互斥方法,那麼可以進入。
2、如果另一個方法同樣是互斥方法且和該方法對應同一個互斥對象,那麼不可以進入。
3、如果另一個方法同樣是互斥方法且和該方法對應不同的互斥對象,那麼可以進入。

23、String s = new String("xyz");創建了幾個String Object?
答:可能是一個、也可能是兩個!一個的情況是隻在堆中創建了一個“xyz”對象;兩個的情況是在堆中和String池中分別創建了一個!

24、short s1 = 1; s1 = s1 + 1;有錯嗎? short s1 = 1; s1 += 1;有錯嗎? short s1=1;s1++;有錯嗎?
答:前者有錯,次者沒有錯,後者沒有錯!次者和後者等價於s1=(short)(s1+1)。 

25、從局部內部類中訪問局部變量需要滿足什麼條件?

答:將局部對象聲明爲最終類型。

26、>>和>>>的區別是什麼?

答:>>是用符號位填充右移後的空缺,>>>是用0填充右移後的空缺。

27、整數除0有異常,double除0有沒有異常?

答:沒有異常!Double除0的結果是Infinity(無窮大)!

28、const和goto是不是java的關鍵字?

答:不是,const和goto是java的保留字。

29、將一個整型變量賦給字符型會不會產生錯誤?將一個整數賦給字符型會不會產生錯誤?

答:前者會,後者不會!

30、我們在如下的包結構上定義了一個類ClassA,Packet1.Packet2.ClassA ,運行ClassA時在哪兒運行?

答:運行時要在包結構的上一層目錄來運行。即:java Packet1.Packet2.ClassA ,直接在Packet2下運行不會成功!

31、java進行方法重寫是應該遵循什麼原則?
答:1、重寫的方法不能比被重寫的方法有更嚴格的訪問權限;

        2、重寫的方法不能比被重寫的方法產生更多的異常;

        3、如果方法是靜態的,那麼重寫的方法沒有多態;

32、float a=3.4有什麼錯誤?

答:實數在java中默認是Double型的,應該定義爲float a=3.4f

33、public class TestWhile{
 public static void main(String args[]){
  while(true){
   System.out.println("hello");
  }
  System.out.println("stop");
 }
}上面的程序能否順利通過編譯?

答:不能!如果將System.out.println("stop");去掉就可以通過!

34、public class TestWhile{
 public static void main(String args[]){
  boolean bool=true;
  while(bool){
   System.out.println("hello");
  }
  System.out.println("stop");
 }
}上面的程序能否順利通過編譯?

答:能!!!

35、java中的屬性有沒有多態性?

答:沒有!子類的屬性和父類的屬性同名時叫遮蓋(區覆蓋),屬性的遮蓋是沒有多態的。關於屬性遮蓋的種種問題,可以參見我的另一篇博客-----“java繼承時的幾個注意事項”!

36、用this()調用同一個類的其他構造方法,需要注意什麼?

答:必須將this()放在構造方法的第一行!注意:此時this()是在構造方法中的,即在成員方法中不能使用this()形式來調用構造方法!

37、方法重寫時,父類中的私有方法與子類中的方法能否構成覆蓋關係?

答:不能!也就是說只有父類被子類繼承過來的方法,纔有可能與子類自己的方法構成覆蓋關係!

38、實現代碼複用有哪兩種形式?

答:1、白盒複用,也就是繼承複用,破壞封裝,父類中的可以被子類訪問到的就可以被繼承,這樣會有些不需要的內容被繼承下來,所以這種方式不太好。
        2、黑盒複用,也叫組合複用,也就是把要複用代碼的類的對象作爲本類中的一個屬性,然後再通過方法的委託來實現有選擇的複用。方法的委託就是在本類的方法內部通過該類的對象調用要使用類的方法,不破壞封裝。
      注意:儘量用組合複用替代繼承複用。

39、可否用private和protected修飾一個類?

答:不可以!!

40、public class test{
 public static void main(String args[]){
  String s="abc";
  String s1=s.intern();
  System.out.println(s==s1);
 }
}
上面的程序輸出什麼?答:true!

public class test{
 public static void main(String args[]){
  String s=new String("abc");
  String s1=s.intern();
  System.out.println(s==s1);
 }
}
上面的程序輸出什麼?答:false!

41、如果子類從父類繼承了一個靜態方法(沒有對其進行重寫),那麼當通過子類命調用該方法時,會不會加載子類?

答:不會!只會加載父類!

42、向HashSet和TreeSet中添加自定義類時,分別需要注意什麼?

答:HashSet:採用哈希算法保證元素不重複,自定義類需要根據實際情況對hashCode()和equals()進行繼承或重寫!
        TreeSet:自定義類必須要實現comparable接口!

43、接口的意義都有哪些?

答: 1,接口可以實現多繼承。
          2,用接口可以實現混合類型(主類型,副類型),java中可以通過接口分出主次類型。主類型使用繼承,副類型,使用接口實現。
          3,他起到了降低耦合性的作用,接口可以使方法的定義和實現相分離,也就是將接口的定義者和實現者相分離,接口也可以用於降低模塊間或系統間的耦合性。

          4、 針對接口編程可以屏蔽不同實現間的差異,看到的只是實現好的功能。

44、匿名內部類)是否可以繼承其它類,是否可以implements(實現)interface(接口)?
答:匿名的內部類是沒有名字的內部類。不能繼承其它類,但一個內部類可以作爲一個接口,由另一個內部類實現。

45、Collection 和 Collections的區別是什麼?
答:Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法!Collection是個java.util下的接口,它是各種集合結構的父接口。

46、error和exception有什麼區別?
答:error是不能再程序中預先對其進行處理的非常嚴重的程序運行時錯誤,如緩衝區溢出; 
      exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。

47、HashMap和Hashtable的區別?

答:都屬於Map接口的類,實現了將惟一鍵映射到特定的值上。HashMap 類沒有分類或者排序。它允許一個 null 鍵和多個 null 值。
Hashtable 類似於HashMap,但是不允許null 鍵和null 值,它也比HashMap慢,因爲它是同步的。

48、什麼時候用assert?
答:斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式爲true。如果表達式計算爲 false,那麼系統會報告一個

AssertionError。它用於調試目的:
  assert(a > 0); // throws an AssertionError if a <= 0
斷言可以有兩種形式:    
  assert Expression1 ;
  assert Expression1 : Expression2 ;
Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。
斷言在默認情況下是禁用的。要在編譯時啓用斷言,需要使用 source 1.4 標記: 
  javac -source 1.4 Test.java
要在運行時啓用斷言,可使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要系統類中啓用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啓用或者禁用斷言。
 1.可以在預計正常情況下程序不會到達的地方放置斷言 :assert false
 2.斷言可以用於檢查傳遞給私有方法的參數。(對於公有方法,因爲是提供給外部的接口,所以必須在方法中有相應的參數檢驗才能保證代

碼的健壯性)
 3.使用斷言測試方法執行的前置條件和後置條件
 4.使用斷言檢查類的不變狀態,確保任何情況下,某個變量的狀態必須滿足。(如age屬性應大於0小於某個合適值)

49、Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?
答:方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overload是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

50、this關鍵字是否可以作爲函數參數?

答:可以!代碼如下:

class A
{
 public void run()
 {
  new B(this).run();//此處this的用法見下面的解釋
 }
}

class B
{
 private A a;
 String name = "張三";
 public B(A a)
 {
  this.a = a;
 }
 public void run()
 {
  System.out.println(name + " is running!!!!!");
 }
}
類A中有個run()方法,類B中也有個run()方法,在類A中的run()方法中調用類B的run()方法,首先我們需要在類A的run()方法中創建一個類B的

對象即new B(A a),
根據第三種this的用法,在該類中,我們可以用this來指向該類的對象實例,所以可以寫成new B(this).run();
寫出main方法測試一下
class Demo
{
 public static void main(String [] args)
 {
  A a = new A();
  a.run();
 }
}
運行結果:張三 is running!!!!!

發佈了69 篇原創文章 · 獲贊 55 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章