Object class 😊
Is the parent of all classes. (all classes inherit directly or indirectly from the Object class)
Its parameters can receive any object, and it can return any object as a return value.
Refer to the tutorial: (/▽\)
toString method
It is recommended to override the toString method, otherwise the address will be printed.
When outputting a reference, println() will automatically call the toString() method of the reference.
Source code:
public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Default implementation method: convert the memory address of the class name @ object to hexadecimal
Case:
// Define MyTime class class MyTime{ int year; int month; int day; public MyTime(){} public MyTime(int year, int month, int day){ this.year = year; this.month = month; this.day = day; } public String toString(){ return this.year + "/" + this.month + "/" + this.day; } } // Test class public class Test01{ public static void main(String[] args){ MyTime t1 = new MyTime(1970, 1, 1); // If a date object is converted into a string, I may still want to see the specific date information. //Before the MyTime class overrides the toString() method //System.out.println(t1.toString()); // MyTime@28a418fc //After the MyTime class overrides the toString() method System.out.println(t1.toString()); // 1970/1/1 } }
equals method
Use the equals method to determine whether two objects are equal.
In the equals method in the Object class, the default is "= =" to judge whether two java objects are equal. And "= =" determines the memory addresses of two java objects. Therefore, the default equals method determines the memory address of the Object.
Note the null pointer exception: this cannot be equal to null
Source code:
public boolean equals(Object obj) {
return (this == obj);
}
Case:
// Still define the MyTime class, but override the equals method public boolean equals(Object obj) { if(obj == null || !(obj instanceof MyTime)){ return false; } if(this == obj){ return true; } MyTime t = (MyTime)obj; return this.year == t.year && this.month == t.month && this.day == t.day ; } // Main program of test class public static void main(String[] args){ // To judge whether the data of two basic data types are equal, just use "= =". "= =" judge whether 100 saved in a is equal to 100 saved in b. int a = 100; int b = 100; System.out.println(a == b); //true (equal) false (unequal) // Create a date object: August 8, 2008. MyTime t1 = new MyTime(2008, 8, 8); //MyTime t1 = 0x1234; // A new date object is created, but the date represented is also August 8, 2008. MyTime t2 = new MyTime(2008, 8, 8); //MyTime t2 = 0x3698; // The "= =" here determines whether the object memory address saved in t1 and the object memory address saved in t2 are correct System.out.println(t1 == t2); // false // Before overriding the Object equals method (the object memory address is compared) System.out.println(t1.equals(t2)); //false // After overriding the Object equals method (the content is compared.) boolean flag = t1.equals(t2); System.out.println(flag); //true MyTime t4 = null; System.out.println(t1.equals(t4)); //false }
Summary:
- Whether the basic data types in java are equal, use==
- All reference data types in java use the equals method to determine whether they are equal.
equals() override considerations
Step 1: first design the Address class
class Address{ String city; String street; String zipcode; public Address(){} public Address(String city,String street,String zipcode){ this.city = city; this.street = street; this.zipcode = zipcode; } // The equals method here determines whether the Address object and the Address object are equal. public boolean equals(Object obj){ if(obj == null || !(obj instanceof Address)) return false; if(this == obj) return true; // The same city, the same street and the same zip code mean that the same family address is the same. Address a = (Address)obj; if(this.city.equals(a.city) && this.street.equals(a.street) && this.zipcode.equals(a.zipcode)){ return true; } return false; } }
Step 2: redesign the User class
class User{ String name; // user name Address addr; // User's address public User(){} public User(String name, Address addr){ this.name = name; this.addr = addr; } // Override the equals method // Rewrite rule: when a user's user name and home address are the same, it means the same user. // This equals determines whether the User object is equal to the User object. public boolean equals(Object obj){ // When the user name is the same as the user name, and the address is the same as the address, it is considered to be the same user. if(obj == null || !(obj instanceof User)) return false; if(this == obj) return true; User u = (User)obj; if(this.name.equals(u.name) && this.addr.equals(u.addr)){ return true; } return false; } }
Step 3: Test Procedure
public static void main(String[] args){ User u1 = new User("zhangsan", new Address("Beijing","Daxing District","11111")); User u2 = new User("zhangsan", new Address("Beijing","Daxing District","11111")); System.out.println(u1.equals(u2)); // true User u3 = new User("zhangsan", new Address("Beijing","Chaoyang District","11112")); System.out.println(u1.equals(u3)); // false }
equals and toString in the String class
The String class has overridden the equals method. You cannot use = =, but must use equals when comparing two strings.
The String class has overridden the toString method.
hashCode method
The hashCode() method returns a hash code, which can be regarded as the memory address of a java object.
(in fact, it is the memory address of a java object and a value obtained through the hash algorithm.)
Source code:
public native int hashCode();
This method is not an abstract method. It has a native keyword and calls the C + + program at the bottom.
// Define MyClass class class MyClass{} // Main method of test program public static void main(String[] args){ Object o = new Object(); int hashCodeValue = o.hashCode(); System.out.println(hashCodeValue); //798154996 MyClass mc = new MyClass(); int hashCodeValue2 = mc.hashCode(); System.out.println(hashCodeValue2); //1392838282 }
getClass method
Returns the actual object type stored in the reference.
Application: it is usually used to judge whether the actual storage object types in two references are consistent.
// Define MyClass class class MyClass{} // Main method of test program public static void main(String[] args) { MyClass mc1 = new MyClass(); MyClass mc2 = new MyClass(); System.out.println(mc1.getClass() == mc2.getClass()) // true }
Clone method (understand)
Refer to: (/▽\)
Knowledge points involved: deep copy and shallow copy
finalize method (goodbye)
Has withdrawn from the stage of history.