# How to override toString() & equals() (Object vs. Objects) ###### tags: `Java` `Basic Java` 1. toString() & System.out.println Reference:[如何优雅地打印一个Java对象?](https://juejin.cn/post/6844904058126499854) 使用System.out.println(object)要列印出一個instance的時候,因為系統默認執行object.toString(),故會輸出一串classname + @ + hashcode的結果 (默認的原因: object為所有class的superclass) object toString()原本的語法 ``` public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } ``` 故若要印出原本預期的結果時,需要override原本的toString()方法 語法如下: ``` public class Classname { private String name; // 省略attribute/constructor/getter/setter @Override public String toString() { return name; } } ``` 2. equals()的override Reference: [Overriding equals method in Java](https://www.geeksforgeeks.org/overriding-equals-method-in-java/) 不Override的情況: 下面這段code會輸出NG ``` public class Main { public static void main(String[] args) { Color c1 = new Color("red"); Color c2 = new Color("red"); System.out.println(c1.name); System.out.println(c2.name); if (c1.equals(c2)) { System.out.println("OK"); } else { System.out.println("NG"); } } } ``` 輸出NG的原因: 因為object默認執行下面的這個方法 ``` public boolean equals(Object obj) { return (this == obj); } ``` 這邊使用==,意思是若兩物件指向同一個參照來源,才會回傳true 但原本印出NG的code,instantiate了兩個物件(有著兩個不同的指向來源),因此執行equals方法的時候回傳了false 故若要印出原本預期的結果時,需要override原本的equals()方法 語法如下: ``` @Override public boolean equals(Object o) { // 檢查物件跟自己比,等值的話就回傳 if (o == this) { return true; } // 檢查物件是否為Class的實例,若否就回傳false, 物件為null的情況也回傳false if (!(o instanceof *Classname* )) { return false; } // 將物件typecast(類型傳換)為我們要判斷的Class,才可以比較資料成員 Complex c = (Complex) o; // 用if else開始比較 } } ``` 簡而言之,改寫步驟如下: * 檢查跟自己是否一致 * 檢查是否是class的實例(這裡用not的方式寫回傳false較好,應該可以寫比較短) * 進行最終判斷 偷懶寫法:intellij IDEA直接generate自動生成 看看自動生成的寫法,以一個Student的類別來說明 ``` class Student { String name; char sex; int age; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return sex == student.sex && age == student.age && Objects.equals(name, student.name); } } ``` 這邊帶出另一個類別叫做**Objects**,Objects是Object的子類 從Objects.equals()的原始碼來看,它所使用的equals多了空值檢查 使用上更為安全,可以避免NullPointerException ``` public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } ``` 來看一下下方的舉例 ``` String s1 = "banana"; String s2 = null; System.out.println(s1.equals(s2)); ``` 此時會出現NullPointerException 所以要稍微改寫一下 ``` System.out.println(Objects.equals(s1, s2)); ``` 這樣就沒事了~~
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up