Object Class: equals, hashCode, toString
Every class implicitly extends the Object class, so every object gets toString(), equals(), and hashCode() for free.
The default toString() gives odd-looking text (like ClassName@hashcode) — which is why we override it for readable output.
equals() and hashCode() should be overridden together — this is essential for HashMap/HashSet to work correctly.
class Point {
int x, y;
public String toString() { return "(" + x + "," + y + ")"; }
public boolean equals(Object o) {
if (!(o instanceof Point)) return false;
Point p = (Point) o;
return x == p.x && y == p.y;
}
}equals() ka ek formal contract follow karna chahiye: reflexive (a.equals(a) hamesha true), symmetric (a.equals(b) == b.equals(a)), transitive (a=b aur b=c to a=c), aur consistent (bina data change kiye baar-baar call karne par same result). In rules ko todne se Collections (HashMap, HashSet) mein ajeeb, hard-to-debug bugs aate hain.
Rule: agar do objects equals() se equal hain, unka hashCode() bhi same hona *chahiye* (reverse zaroori nahi — alag objects same hashCode share kar sakte hain, "collision" kehlata hai, aur HashMap ise handle kar leta hai). Isiliye equals() override karte waqt hashCode() bhi hamesha saath override karo, warna HashMap/HashSet mein duplicate detection fail ho jaayega — same "equal" object do baar add ho sakta hai!
class Point {
int x, y;
public boolean equals(Object o) { /* x,y compare */ return true; }
public int hashCode() { return Objects.hash(x, y); } // dono saath
}Default toString() (ClassName@hashcode, jaise Point@1b6d3586) debugging mein useless hota hai. Override karke meaningful representation do — jaise "Point{x=3, y=5}". IDE aur logging tools automatically toString() use karte hain jab object print hota hai ya debugger mein dekha jaata hai.
Har object par .getClass() call karke uski runtime class pata kar sakte ho (obj.getClass().getName()) — ye equals() implementation mein instanceof ke bajaye bhi use hota hai kabhi-kabhi (strict type matching ke liye). Ye "Reflection" API ka entry point hai — advanced feature jisse runtime par classes/methods inspect/call kar sakte ho (frameworks jaise Spring isi par heavily depend karte hain, dependency injection ke liye).