1. 程式人生 > >Java--繼承(四)

Java--繼承(四)

沒有 equal 其中 vat 默認 統一 重新定義 參數 變量引用

受保護訪問

   Java中一般最好將類中的域標記為private,而方法標記為public。
   Java中用於控制可見性的4個訪問修飾符:
  • 僅對本類可見——private
  • 對所有類可見——public
  • 對本包和所有子類可見——protected
  • 對本包可見——默認,不需要修飾符

Object:所有類的超類

  Object類是Java中所有類的始祖。
  可以使用Object類型的變量引用任何類型的對象。但是要想對其中的內容進行具體的操作,還需要清楚對象的原始類型,並進行相應的轉換。
  父類類型的變量可以引用子類對象,但是子類類型的變量不可以引用父類對象。
  Java中只有基本類型(數值、字符、布爾類型)不是對象。
  所有的數組類型,不管是對象數組還是基本類型的數組都擴展了Object類

equals方法

  Object類中的equals方法用於檢測一個對象是否等於另外一個對象。
  這個方法將判斷兩個對象是否具有相同的引用。如果兩個對象具有相同的引用,它們一定是相等的。(對於多少類來說,這種判斷沒有什麽實際意義)


  Java語言規範要求equals方法具有下面的特性:
  自反性:對於任何非空引用x,x.equals(x)應該返回true
  對稱性:對於任何引用x和y,當且僅當y.equals(x)返回true,y.equals(y)也應該返回true。
  傳遞性:對於任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也應該返回true。
  一致性:如果x和y引用的對象沒有發生變化,反復調用x.equals(y)應該返回同樣的結果.

  具體步驟:
  1. 顯示參數命名為otherObject,稍後需要將它轉換成另一個叫做other的變量
     public boolean equals(Object otherObject)
  2.檢測this與otherObject是否引用同一個對象
     if (this == otherObject) return true
  3.檢測otherObject是否為null,如果為null,返回false。
     if (otherObject == null) return false
  4.比較this 與 otherObject是否屬於同一個類。
      如果equals的語義在每個子類中有所改變,就是用getClass檢測: 
             if ( getClass() != otherObject.getClass()) return false
       如果所有的子類都擁有統一的語義,就是用instanceof檢測:
             if( !(otherObject instanceof ClassName)) return false;
  5.將otherObject轉換為相應的類類型變量
       ClassName other = (ClassName) otherObject
  6.現在開始對所有需要比較的域進行比較了。
      使用==比較基本類型域,使用equals比較對象域。如果所有域都匹配,就返回true;否則返回false
      return field1 == other.field1 && Objects.equals(field2,other.field2)
                 && ...
  如果在子類中重新定義equals,就要在其中包含調用super.equals(other)。      
         

 重寫了equals方法,就一定要重寫haseCode方法

Java--繼承(四)