Object類
簡介:超類、基類,所有類的直接或間接父類,位於繼承樹的最高層
特點:
- 任何類,如果沒有書寫extends顯式繼承某個類,都默認繼承Object類
- Object類中所定義的方法,是所有對象都具備的方法
- Object類可以存儲任何對象:作爲參數,可接收任何對象;作爲返回值,可返回任何對象。
1. getClass()
public final Class<?> getClass() {}
返回引用中存儲的實際對象類型。
應用:通常用於判斷兩個引用中實際存儲對象類型是否一致。
public class TestMethodForGetClass {
public static void main(String[] args) {
Animal[] as = new Animal[] {new Dog(), new Cat(), new Dog()};
if (as[0] instanceof Dog) {
//...
} else if (as[0] instanceof Cat) {
//...
}
System.out.println(as[0].getClass()); // class com.day20.t4_objects.Dog
System.out.println(as[1].getClass().getName()); // com.day20.t4_objects.Cat
System.out.println(as[0].getClass() == as[1].getClass()); // false
System.out.println(as[0].getClass() == as[2].getClass()); // true
}
}
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
2. hashCode()
public int hashCode() {}
返回該對象的十六進制的哈希碼值(對象在內存中的數字型名字)。
哈希算法根據對象的地址或者字符串或者數字計算出來的int類型的數值。
哈希碼並不唯一,可保證相同對象返回相同的哈希碼,儘量保證不同對象返回不同的哈希碼值。
public class TestMethodForHashCode {
public static void main(String[] args) {
// 引用數據類型 .hashCode()
Teacher t1 = new Teacher();
System.out.println(t1.hashCode());
String s1 = "abc";
System.out.println(s1.hashCode());
}
}
class Teacher {}
3. toString()
返回該對象的字符串表示(表現形式)。
可以根據程序需求覆蓋該方法,如展示對象各個屬性值。
特點:
- 對象中屬性的表現形式,常用於展示對象的各個屬性。
源碼:
// 對象.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public class TestMethodForToString2 {
public static void main(String[] args) {
Worker worker = new Worker();
worker.name = "Jerry";
worker.age = 22;
worker.sex = "男";
worker.salary = 15000.0;
// 對象中屬性的表現形式,常用於展示對象的各個屬性。
System.out.println(worker.toString());
}
}
class Worker {
String name;
int age;
String sex;
double salary;
// 覆蓋父類Object類的toString()方法 - Alt+Shift+S +s
@Override
public String toString() {
return "Worker [name=" + name + ", age=" + age + ", sex=" + sex + ", salary=" + salary + "]";
}
}
4. equals();
public boolean equals(Object obj)
默認實現爲 this == obj, 比較兩個地址是否相同。
特點:
-
可進行覆蓋,比較兩個對象的內容是否相同。
重寫覆蓋父類Object.equals()方法,五步走: 1.判斷引用地址是否相同 2.判斷引用地址是否爲空 3.確認對象類型是否一致 4.轉型 - 向下轉型拆箱 5.比較對象中的實際內容
public class TestMethodForEquals {
public static void main(String[] args) {
Student s1 = new Student("tom", 20, "男", 99D);
Student s2 = new Student("tom", 20, "男", 99D);
System.out.println(s1.hashCode() + " " + s2.hashCode()); // !=
System.out.println(s1.equals(s2)); // equals:不重寫就是false,重寫後爲true
}
}
class Student {
String name;
int age;
String sex;
double score;
public Student() {}
public Student(String name, int age, String sex, double score) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
/**
* 重寫覆蓋父類Object.equals()方法,五步走:
* 1.判斷引用地址是否相同
* 2.判斷引用地址是否爲空
* 3.確認對象類型是否一致
* 4.轉型 - 向下轉型拆箱
* 5.比較對象中的實際內容
*/
@Override
public boolean equals(Object obj) {
// 1.地址不同
if (this == obj) {
return true;
}
// 2.內容非空
if (obj == null) {
return false;
}
// 3.類型一致
if (this.getClass() != obj.getClass()) {
return false;
}
// 4.向下轉型 - 拆箱
Student stu = (Student)obj;
// 5.比較內容 - 需要覆蓋toString()方法
if (this.toString().equals(stu.toString())) {
return true;
}
return false;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", score=" + score + "]";
}
}