java容易混淆的知識點

     1.     抽象類和接口有什麼區別?

1.abstract class  Java 語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。但是,一個類卻可以實現多個interface

2.abstract class 中可以有自己的數據成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態的不能被修改的數據成員(也就是必須是static final的,不過在 interface中一般不定義數據成員),所有的成員方法都是abstract的。

3.abstract classinterface所反映出的設計理念不同。其實abstract class表示的是"is-a"關係,interface表示的是"like-a"關係。

4.實現抽象類和接口的類必須實現其中的所有方法。抽象類中可以有非抽象方法。接口中則不能有實現方法。

5.接口中定義的變量默認是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值。

6.抽象類中的變量默認是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。

7.接口中的方法默認都是 public,abstract 類型的。

        2.    final,finally,finalize的區別。

(1)final—修飾符(關鍵字)可修飾變量,類和方法

如果一個類被聲明爲final,意味着它不能再派生出新的子類,不能作爲父類被繼承。因此一個類不能既被聲明爲 abstract的,又被聲明爲final的。

將變量或方法聲明爲final,可以保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。

被聲明爲final的方法也同樣只能使用,不能重載。

(2)finally—再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)。 

(3)finalize—方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的。

    3  equals()方法和“==”操作符的區別是什麼?重寫equals()方法的時候,我們還需要重寫哪些方法?爲什麼?

    (1)“==”比較的是一個對象在內存中的地址值,棧中的內容是否相同。

 

    (2) equals()是針對引用的,比較的是引用類型的內容一樣不一樣,堆中的內容是否相同

重寫equals()方法的時候,需重寫hashcode方法,這樣比較的時候,比較的是兩個對象的hash值,不同對象的hash值不同。

  重寫equals方式例子:

 

public boolean equals(Object obj){
   

//判斷Usefor類對象的UseName和UseId是否相同

  if(obj instanceof Usefor)  {
  Usefor usefor=(Usefor) obj;
  int Id=usefor.getUseId();
  String name=usefor.getUseName();
   if(this.UseId==Id&&this.UseName.equals(name))
      {
   return true;
   
   }
   
  } 

 

   3.簡述StringStringBufferArrayList LinkedListHashMap

HashTable的特點及區別

答:(1)String 對象的長度一旦定義就固定就不可以改變,對於已經存在的String對象的修改都是創建一個新的對象,然後把新的值存進去,String類不能被繼承。StringBuffer是一個可變對象,當對它進行修改的時候不會像String那樣重新建立對象。它只能通過構造函數來建立對象。另外StringBuffer還是一個線程安全的類。

(2)ArrayList是實現了基於動態數組的數據結構用於,LinkedList基於連表的數據結構,二者都可以存儲對象的引用。對於隨機訪問get和set,ArrayList優於LinkedList,因爲LinkedList要移動指針。對於新增和刪除操作add和remove,LinkedList比較佔優勢,因爲ArrayList要移動數據。

(3 )HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,在只有一個線程訪問的情況下,效率要高於Hashtable。
HashMap允許將null作爲一個entry的key或者value,而Hashtable不允許。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因爲contains方法容易讓人引起誤解。
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己爲它的方法實現同步,而HashMap 就必須爲之提供外同步。
    Hashtable和HashMap採用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。就HashMap與HashTable主要從三方面來說。
一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現
二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作爲一個表的條目的key或value

4.簡述靜態成員和非靜態成員的區別

   靜態變量使用 static 修飾符進行聲明,在類被實例化時創建,通過類進行訪問。不帶

有 static 修飾符聲明的變量稱做非靜態變量,在對象被實例化時創建,通過對象進行訪問。一

個類的所有實例的同一靜態變量都是同一個值,同一個類的不同實例的同一非靜態變量可以是不同的值。靜態函數的實現裏不能使用非靜態成員,如非靜態變量、非靜態函數等。

 

 

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