[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;
}
}
~~~
- windows -- 環境變量
- Vscode -- 編寫java
- 初始java
- java -- 關鍵字
- 編寫第一個java程序
- java -- 注釋
- 計算機存儲 -- 進制
- java -- 類型
- java -- 變量
- 數字類型
- 布爾類型
- 字符類型
- 類型轉換
- 雙等比較是什么
- java -- 運算符
- 算數運算符
- 字符串拼接
- 關系/比較運算符
- 自增減運算符
- 邏輯運算符
- 三目運算
- 賦值運算符
- 移位運算符
- 位運算符
- 運算符優先級
- java -- 流程控制語句
- if /else if /if -- 判斷
- switch case分支結構
- for -- 循環
- 用雙重for循環
- while -- 循環
- do while -- 循環
- 案例練習
- java -- 數組
- 數組的存儲
- 數組的增刪改查
- 數組的特點
- 數組案例
- 二維數組
- 數組的工具方法
- java -- 方法
- java -- 方法的重載
- java -- 方法的調用流程
- java -- 類方法傳參注意事項
- java -- 方法練習案例
- 對比 return break continue
- for each循環
- java -- 基礎練習
- java -- 面向對象
- java -- 創建類和對象
- java -- 訪問控制符
- java -- 類成員方法
- java -- 構造方法
- java -- this
- java -- 封裝
- java -- 對象內存圖
- java -- 創建對象案例
- java -- static
- java -- 繼承
- super -- 關鍵字
- java -- 構造塊和靜態代碼塊
- java -- 重寫
- java -- final
- java -- 多態
- java -- 抽象類
- java -- 接口
- 引用類型數據轉換
- 綜合案例
- java -- 內部類
- java -- 回調模式
- java -- 枚舉類型
- java -- switch 使用枚舉
- java -- 枚舉方法使用
- java -- 枚舉類實現接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 遞歸練習
- java -- 設計模式
- 單例模式
- java -- 注解
- java -- 元注解
- Java -- 核心類庫
- java -- 處理字符串
- Java -- String
- String -- 常用方法
- String -- 正則
- Java -- StringBuilder 和 StringBuffer
- 知識點
- Java -- StringJoiner 字符串拼接
- 練習題
- 字符串的總結
- Java -- 包裝類
- Integer
- Double
- Boolean
- Character
- java -- 集合類
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 獲取當前時間戳
- Java -- 異常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法