Object類
- 類 Object是類層次結構的根(夫)類。
- 每個類(Person,Student…)都使用Object作爲超類(父類)。
- 所有對象(包括數組)都實現這個類的方法
toString方法
方法摘要
public String toString()
:返回該對象的字符串表示。
toString方法返回該對象的字符串表示,其實該字符串內容就是對象的類型+@+內存地址值。
由於toString方法返回的結果是內存地址,而在開發中,經常需要按照對象的屬性得到相應的字符串表現形式,因此也需要重寫它。
覆蓋重寫
如果不希望使用toString方法的默認行爲,則可以對它進行覆蓋重寫(快捷鍵:alt+insert)。例如自定義的Person類:
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
代碼演示
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//alt+insert 快捷鍵重寫toString方法
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Demo01ToString {
public static void main(String[] args) {
/*
Person類默認繼承了Object類,所以可以使用Object類中的toString方法
String toString()返回該對象的字符串表示
*/
Person person = new Person("張三",18);
String s = person.toString();
//toString默認輸出的是地址
System.out.println(s);//com.company.demo01.Person@4554617c | Person{name='張三', age=18}
//直接打印對象的名字,其實就是調用對象的toString person=person.toString;
System.out.println(person);//com.company.demo01.Person@4554617c | Person{name='張三', age=18}
//看一個類是否重寫了toString方法,直接打印這個類的對象即可,如果沒有重寫toString方法,那麼打印的是對象的地址值
Random random = new Random();
System.out.println(random);//java.util.Random@74a14482
Scanner scanner = new Scanner(System.in);
System.out.println(scanner);//java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0e
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list);//[1, 2, 3]
}
}
equals方法
方法摘要
public boolean equals(Object obj)
:指示其他某個對象是否與此對象“相等”。
調用成員方法equals並指定參數爲另一個對象,則可以判斷這兩個對象是否是相同的。這裏的“相同”有默認和自定義兩種方式。
默認地址比較
如果沒有覆蓋重寫equals方法,那麼Object類中默認進行==
運算符的對象地址比較,只要不是同一個對象,結果必然爲false。
源碼:
public boolean equals(Object obj) {
return (this == obj);
}
對象內容比較
如果希望進行對象的內容比較,即所有或指定的部分成員變量相同就判定兩個對象相同,則可以覆蓋重寫equals方法。例如:
import java.util.Objects;
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
// 如果對象地址一樣,則認爲相同
if (this == o)
return true;
// 如果參數爲空,或者類型信息不一樣,則認爲不同
if (o == null || getClass() != o.getClass())
return false;
// 轉換爲當前類型
Person person = (Person) o;
// 要求基本類型相等,並且將引用類型交給java.util.Objects類的equals靜態方法取用結果
return age == person.age && Objects.equals(name, person.name);
}
}
代碼演示
import java.util.Objects;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//alt+insert equals() and hashcode() 快捷鍵重寫equals方法
//使equals可以比較對象的屬性
@Override
public boolean equals(Object o) {
if (this == o) return true;
//getClass() != o.getClass() 使用反射技術,判斷o是否是person類型,等效於 obj instanceof Person
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
//用Objects可以防止空指針異常
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Demo02Equals {
public static void main(String[] args) {
Person p1 = new Person("張三", 18);
Person p2 = new Person("張三", 18);
//比較p1與p2 默認比較地址值,重寫equals後比較屬性內容
System.out.println("p1與p2比較結果爲"+p1.equals(p2));
}
}
Objects類
在JDK7添加了一個Objects工具類,它提供了一些方法來操作對象,它由一些靜態的實用方法組成,這些方法是null-save(空指針安全的)或null-tolerant(容忍空指針的),用於計算對象的hashcode、返回對象的字符串表示形式、比較兩個對象。
在比較兩個對象的時候,Object的equals方法容易拋出空指針異常,而Objects類中的equals方法就優化了這個問題。方法如下:
public static boolean equals(Object a, Object b)
:判斷兩個對象是否相等。
我們可以查看一下源碼,學習一下:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
代碼演示
public class Demo03Objects {
public static void main(String[] args) {
String s1 = null;
String s2 = "s2";
//null是不能調用方法的,否則會出現空指針異常
// boolean b = s1.equals(s2);
// System.out.println(b);
//使用Objects的equals方法比較,不會出現空指針異常
boolean equals = Objects.equals(s1, s2);
System.out.println(equals);
}
}