Java面試之基礎題---物件Object

忘塵天外天發表於2017-11-22

引數傳遞:Java支援兩種資料型別:基本資料型別和引用資料型別。

  原始資料型別是一個簡單的資料結構,它只有一個與之相關的值。引用資料型別是一個複雜的資料結構,它表示一個物件。原始資料型別的變數將該值直接儲存在其儲存器地址處。使用物件和引用變數時會有所不同。。Java中的所有引數都通過值傳遞。

  當引數是原始是原始資料型別時,實際引數的值將複製到引數。在方法主體中對引數值進行的任何更改只會更改形式引數的副本,而不會更改實際引數的值。當引數通過參考值傳遞時,儲存在實際引數中的參考被複制到形式引數。實際引數和形式引數都指向記憶體中的相同物件。形式引數可以通過直接更改例項變數的值或通過呼叫物件上的方法來修改物件。通過形式引數對物件進行任何修改都可以通過實際引數立即可見,因為它們對儲存對記憶體中同一物件的引用。形式引數本身可以被修改以引用方法內的另一個物件。要禁用將引用型別形式引數更改為引用不同物件的方法,在引用型別形式引數宣告中使用關鍵字final。

  可變長度引數:(varargs:variable-length arguments),宣告一個接受可變數量的引數的方法或建構函式。宣告可變長度引數,在方法引數的資料型別之後新增一個省略號...,省略號...之前和之後新增空格時可選的。可變長度引數方法可以有多個引數,但最多可以有一個可變長度引數。可變長度引數方法的可變長度引數必須是引數列表的最後一個,可以使用for迴圈來處理可變長度引數的引數列表。length屬性給出了可變長度引數傳遞的值的數量。

  過載可變長度引數方法

  方法過載規則適應於可變長度引數方法。可以使用可變長度引數過載一個方法,只要方法的引數在連續順序或數字上不同。

  Java的關鍵字this。它是對類的當前例項的引用。它只能在例項的上下文使用。當例項變數或類變數被具有相同名稱的另一個變數覆蓋時,需要使用關鍵字this限定一個例項變數,並使用類名稱定義一個類變數。可以使用關鍵字this來限定例項方法名。

  final關鍵字不允許修改或替換其原始值或定義。可以在以下三個上下文中使用:變數宣告,類宣告,方法宣告。變數被宣告為final,它只能被賦值一次。final變數的值在設定後不能修改。變數宣告包括區域性變數的宣告,方法/建構函式的形式引數,例項變數和類變數。final變數的值只設定一次,它不能被重新賦值。有兩種方法來初始化final變數的值:(1)在宣告時給予初始化。(2)將其初始化延遲到稍後的時間。必須在第一次讀取final變數之前初始化它。

  final類,它不能被擴充套件或繼承。

  final方法,不能在包含該方法的類的子類中重新定義(覆蓋或隱藏)

建構函式是用於在物件建立後立即初始化物件的程式碼塊。建構函式的結構看起來類似於一個方法。建構函式名稱與類的名稱相同。建構函式名稱後面是一對括號,可能包括引數。可選的,右括號後面可以是關鍵字throws,其後面是逗號分隔異常列表。

  過載建構函式:一個類可以有多個建構函式。也叫過載建構函式。如果一個類有多個建構函式,它們的順序和引數型別都必須與其它建構函式不同。每個物件建立表示式呼叫一次建構函式。可以在物件建立的過程中只執行一個建構函式的程式碼一次。

  從另一個建構函式呼叫建構函式:建構函式可以呼叫同一類中的另一個建構函式。必須使用關鍵字this從另一個建構函式呼叫另外一個建構函式。如果建構函式呼叫另一個建構函式,它必須是建構函式體中的第一個可執行語句。建構函式不能呼叫自身,因為它將導致遞迴呼叫。

  從建構函式返回:建構函式在其宣告中不能返回型別。但可以在建構函式體中使用沒有返回表示式的return語句。當一個建構函式中的返回語句被執行時,控制返回給呼叫者,忽略建構函式的其餘程式碼。

  靜態初始化塊:靜態初始化器。當類定義被載入到JVM中時,只對一個類執行一次靜態初始化器,需要在其宣告的開頭使用static關鍵字。在一個類中可以有多個靜態初始化器。所有靜態初始化器都按文字出現的順序執行,並在任何例項初始化器之前執行。

  Java  Object 類:在java.lang 包中。所有的Java類都直接或間接擴充套件Object類。所有的Java類都是Object類的子類,Object類是所有類的超類。Object類本身沒有超類。Object類的引用變數可以儲存任何類的物件的引用。Object類有九個方法。可以在Java中的所有類中使用。toString、equals、hashCode、clone、finalize沒有實現,需要子類自定義。在物件銷燬前被垃圾收集器呼叫。notify、notifyAll、wait、getClass()在Object類中實現,不能自定義它。它返回對物件的Class物件的引用。 

  物件的雜湊程式碼:雜湊碼(也叫雜湊碼)是一個整數值。計算整數的演算法稱為雜湊函式。Java使用雜湊碼從基於雜湊的集合中有效地檢索資料。Object類有一個返回int的hashCode方法,它是物件的雜湊碼。該方法的預設實現通過將物件的記憶體地址轉換為整數來計算物件的雜湊碼。如果兩個物件使用equals()方法相等,則它們必須具有相同的雜湊碼。如果對同一個物件多次呼叫hashCode()方法,則該方法必須返回相同的整數值。如果一個類覆蓋這兩個方法中的任何一個,它必須基於雜湊集合覆蓋該類的物件以保證能正確工作。Java 7 引入了一個實用程式類java.lang.Objects 。它包含一個hash()方法,用於計算任意數量值的雜湊碼。

  equals()方法的特性:1.自反性。x.equals(x)應該返回true

  2、對稱性。如果x.equals(y)返回true,那麼y.equals(x)

  3、傳遞性,如果x.equals(y)為true,且y.equals(z),那麼x.equals(z)

  4、一致性,如果x.equals(y)返回true,它應該返回true,知道x或y的狀態改變

類的toString()方法非常重要。當需要物件的字串表示時,Java會自動呼叫toString()方法。當連線一個字串和一個物件時,例項呼叫的就是toString()方法。

  Java物件克隆:Java不提供克隆(複製)物件的自動機制。克隆物件意味著逐位複製物件的內容。要支援克隆操作,請在類中實現clone()方法。clone()方法宣告為protected。因此,不能從客戶端程式碼呼叫它。需要在類中宣告clone()方法為public來克隆類的物件。它的返回型別是Object。這就需要使用clone()方法轉換返回值。

  Java提供了一種在物件即將被銷燬時執行資源釋放的方法。在Java中建立物件,但是不能銷燬物件。JVM執行一個稱為垃圾收集器的低優先順序特殊任務來銷燬不再引用的所有物件。垃圾回收器給我們一個機會,在物件被銷燬前執行清理程式碼。Object類有一個finalize()方法就是用於在物件被銷燬之前執行清理程式碼,這個方法宣告為protected,Object類中的finalize()方法不會做任何事情。所以需要覆蓋類中的finalize()方法。

  Java不可變物件:在建立狀態後無法改變狀態的物件稱為不可變物件。一個物件不可變的類稱為不可變類。不變的物件可以由程式的不同區域共享而不用擔心其狀態改變。不可變物件本質上是執行緒安全的。關鍵字final宣告屬性,那麼屬性不可變,物件也就是不可變的。

相關文章