<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] * 注說明來自 java.lang >[success] # java -- Object 1. **Object** 屬于 **java.lang.Object**,是所有Java 語言中類的**根類**,簡單的說所有類的最追根溯源其都是繼承**java.lang.Object** 2. 默認情況上如果沒有指定繼承的父類,即沒有通過**extends**關鍵字聲明其父類,則其父類為 **java.lang.Object** 類 ~~~ // 默認繼承Object public class Circle /* extends Object */ { } ~~~ 3. 因為所有類都繼承了**java.lang.Object** 因此他們都具備**java.lang.Object** 的方法可以進行重寫 >[info] ## java.lang.Object -- 類方法 | 方法聲明 | 功能介紹 | | --- | --- | | Object() | 使用無參方式構造對象 | | boolean equals(Object obj) | 用于判斷調用對象是否與參數對象相等。該方法默認比較兩個對象的地址是否相等,與 == 運算符的結果一致若希望比較兩個對象的內容,則需要重寫該方法。若該方法被重寫后,則應該重寫**hashCode**方法來保證結果的一致性。 | | int hashCode() | 用于獲取調用對象的哈希碼值(內存地址的編號)。若兩個對象調用**equals**方法相等,則各自調用該方法的結果必須相同若兩個調用對象equals方法不相等,則各自調用該方法的結果應該不相同。為了使得該方法與equals方法保持一致,需要重寫該方法。 | | String toString() | 用于獲取調用對象的字符串形式該方法默認返回的字符串為:包名.類名@哈希碼值的十六進制為了返回更有意義的數據,需要重寫該方法使用print或println打印引用或字符串拼接引用都會自動調用該方法Class<?> getClass() 用于返回調用對象執行時的Class實例,反射機制使用 | | protected Object clone() |創建并返回此對象的副本。 | | void notify()| 喚醒正在此對象監視器上等待的單個線程。 | | void notifyAll()| 喚醒等待此對象監視器的所有線程。 | | void wait() | 導致當前線程等待它被喚醒,通常是 通知或 中斷 。 | | void wait?(long timeoutMillis) | 導致當前線程等待它被喚醒,通常是 通知或 中斷 ,或者直到經過一定量的實時。| | void wait?(long timeoutMillis, int nanos) |導致當前線程等待它被喚醒,通常是 通知或 中斷 ,或者直到經過一定量的實時。 | >[warning] ### equals 和 hashCode 組合使用 >[danger] ##### equals -- 理解 * 源碼方法寫法,判讀當前this 是否是一個,比較是內存地址指向 ~~~ public boolean equals(Object obj) { return (this == obj); } ~~~ * 下面案例創建的 st1 和 st2 內容雖然相同但**實際地址不同**,因此打印為false ~~~ public class Student { int id = 0; String name = ""; Student(int id, String name) { this.id = id; this.name = name; } // 入口 public static void main(String[] args) { Student st1 = new Student(1, "wang"); Student st2 = new Student(1, "wang"); // 使用eq 進行比較 boolean flag = st1.equals(st2); System.out.println(flag); // false } } ~~~ * 重寫equals 因為是繼承關系所以可以重寫,重寫后想做到id 相同即認為是同一個人 ~~~ public class Student { int id = 0; String name = ""; Student(int id, String name) { this.id = id; this.name = name; } // 重寫方法 @Override public boolean equals(Object obj) { // 如果傳入是null 防止空指針異常 if (obj == null) return false; // 如果是同一個對象必然相等 if (obj == this) return true; // 先將多態的 obj 向下轉型 為當前 Student 類型 // 這樣是為了可以調用 Student 類型某些屬性和方法 // 傳入的obj 必須是當前類創建的實例 if (obj instanceof Student) { Student student = (Student) obj; // 判讀如果id 相等 怎認為同一個學生 if (this.id == student.id) return true; } return false; } // 入口 public static void main(String[] args) { Student st1 = new Student(1, "wang"); Student st2 = new Student(1, "wang"); // 使用eq 進行比較 id 相同 boolean flag = st1.equals(st2); // 指向相同 Student st3 = st1; boolean flag1 = st3.equals(st1); // 防止空指針異常 Student st4 = null; boolean flag3 = st1.equals(st4); // 創建對象不同且id 也不同 Student st7 = new Student(2, "wang"); boolean flag4 = st1.equals(st7); System.out.println(flag); // true System.out.println(flag1); // true System.out.println(flag3); // false System.out.println(flag4); // false } } ~~~ >[danger] ##### hashCode 1. 默認來說 **hashCode** 獲取調用對象的**哈希碼值** 即內存地址的編號 2. java 官方期望如果 實現的**equals** 讓兩個對象相等,那么兩個對象調用**hashCode** 得到值也應該相同 * 重寫 hashCode 方法,并且在原來equals 方法判讀id 位置替換成判斷hashCode ~~~ package javaTest; public class Student { int id = 0; String name = ""; Student(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } // 重寫 hascode 方法 // 因為期待是id 相同則默認相等 因此重寫hascode 返回為id @Override public int hashCode() { return getId(); } // 重寫方法 @Override public boolean equals(Object obj) { // 如果傳入是null 防止空指針異常 if (obj == null) return false; // 如果是同一個對象必然相等 if (obj == this) return true; // 先將多態的 obj 向下轉型 為當前 Student 類型 // 這樣是為了可以調用 Student 類型某些屬性和方法 // 傳入的obj 必須是當前類創建的實例 if (obj instanceof Student) { Student student = (Student) obj; // 判讀如果id 相等 怎認為同一個學生 return this.hashCode() == student.hashCode(); } return false; } // 入口 public static void main(String[] args) { Student st1 = new Student(1, "wang"); Student st2 = new Student(1, "wang"); // 使用eq 進行比較 id 相同 boolean flag = st1.equals(st2); System.out.println(flag); // true } } ~~~ >[danger] ##### 對比 如果是字符串 * 剛才對比是 id 因為剛才Student 的類 id 是數字類型,也滿足**hashCode** 返回是數字類型,如果比較是字符寫法如下 ~~~ package javaTest; public class Student { int id = 0; String name = ""; Student(int id, String name) { this.id = id; this.name = name; } public String getName() { return name; } // 因為getName 是字符串對象,因此它本身也是具有hashCode方法,只需要調用它的hashCode即可 @Override public int hashCode() { return getName().hashCode(); } // 重寫方法 @Override public boolean equals(Object obj) { // 如果傳入是null 防止空指針異常 if (obj == null) return false; // 如果是同一個對象必然相等 if (obj == this) return true; // 先將多態的 obj 向下轉型 為當前 Student 類型 // 這樣是為了可以調用 Student 類型某些屬性和方法 // 傳入的obj 必須是當前類創建的實例 if (obj instanceof Student) { Student student = (Student) obj; // 判讀如果name相等 認為同一個學生 // return this.hashCode() == student.hashCode(); // getName 是 String 類型 雙等比較是 內存地址,如果想比較內容使用equals return getName().equals(student.getName()); } return false; } // 入口 public static void main(String[] args) { Student st1 = new Student(1, "wang1"); Student st2 = new Student(1, "wang"); // 使用eq 進行比較 name 相同 boolean flag = st1.equals(st2); System.out.println(flag); // false } } ~~~ * 編譯器自動生成重寫 判斷name 和 age 都要相同 ~~~ package javaTest; public class Student { int id = 0; String name = ""; Student(int id, String name) { this.id = id; this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public static void main(String[] args) { Student st1 = new Student(1, "wang1"); Student st2 = new Student(1, "wang"); // 使用eq 進行比較 name 相同 boolean flag = st1.equals(st2); System.out.println(flag); // false } } ~~~ >[warning] ### toString * 用print或println打印引用或字符串拼接引用都會自動調用該方法 ~~~ package javaTest; public class Student { int id = 0; String name = ""; Student(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } } ~~~ > [warning] ### * 用于返回調用對象執行時的Class實例,反射機制使用 ~~~ package javaTest; public class Student { int id = 0; String name = ""; Student(int id, String name) { this.id = id; this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; // 判讀是否是同一個類 if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (id != other.id) return false; return true; } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看