Java整理十一 Object類中的toString()方法與equals()方法 Objects類
阿新 • • 發佈:2021-01-21
技術標籤:筆記
Object類所有類的超類
/*
java.lang.Object類
類 Object是類層次結構的根(最頂層)類。每個類都使用Object作為超(父)類
所有物件(包括陣列)都實現這個類的方法
*/
public class DemoObject {
public static void main(String[] args) {
//Person類預設繼承Object類,所以可以使用Object類中toString方法
//String toString()返回該物件的字串表示
Person p = new Person ("張三",18);
String s = p.toString();
System.out.println(s);//[email protected]
//直接列印物件的名字就是呼叫物件的toString方法 p.toString()
System.out.println(p);//[email protected]
/*
如果一個類是否重寫了toString方法,直接列印這個類對應的物件名字即可
如果沒有重寫toString方法,那麼列印的就是物件的地址值(預設)
如果重寫toString方法,那麼就按照重寫的方法列印
*/
//例如
Random random = new Random();
System.out.println(random);//[email protected] 沒有重寫
Scanner scanner = new Scanner(System.in);
System.out.println(scanner);//java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][
ArrayList< Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
System.out.println(arrayList);//[1, 2] 重寫了
}
}
package cn.itcast.demo;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
直接列印物件的地址值沒有意義需要重寫Object類中的toString方法
列印物件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;
}
}
Object類中的equals()方法
package cn.itcast.demo01equals;
public class DemoEquals {
public static void main(String[] args) {
/*
Person類預設繼承了Object類,所以可以使用Object類的equals方法
boolean eauals(Object obj)指示其他某個物件是否與此物件“想等”。
Object類equals方法原始碼:
public boolean equals(Object obj) {
return (this == obj);
}
引數:
Object obj:可以傳遞任意物件
方法體:
==:比較運算子,返回的就是一個布林值
基本資料型別:比較的是值
引用資料型別:比較的是兩個物件的地址值
this是誰?那個物件呼叫的方法,方法中的this就是那個物件:p1呼叫的equals方法,所以this就是p1
obj是誰?傳遞過來的引數p2
this==obj --> p1=p2
*/
Person p1= new Person("迪麗熱巴",18);
Person p2 = new Person("古力娜扎",20);
boolean equals = p1.equals(p2);
System.out.println(equals);//false
}
}
package cn.itcast.demo01equals;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
直接列印物件的地址值沒有意義需要重寫Object類中的toString方法
列印物件name和age
*/
/*
Object類的equals方法預設比較的是兩個物件的地址值,沒有意義
所以我們需要重寫equals方法,比較兩個物件的屬性值(name,age)
問題:
隱含著一個多型
Object obj = p2 = new Person("迪麗熱巴",18);
多型的弊端:無法使用子類特有的內容(屬性 ,方法)
解決:可以使用向下轉型(強轉)把object型別轉換為Person
*/
// @Override
// public boolean equals(Object obj){
// //增加一個判斷,傳遞的引數obj是this本身,直接返回true提高程式效率
// if(obj == this){
// return true;
// }
// //增加一個判斷,傳遞的引數obj是null,直接返回false
// if(obj == null){
// return false;
// }
// //增加一個判斷,是Person型別在轉換防止型別轉換異常
// if(obj instanceof Person){
// //使用向下轉型(強轉)把Object型別轉換為Person
// Person p = (Person)obj;
// //比較兩個物件的屬性;一個是呼叫方法的this(p1),一個就是p(obj=p2)
// boolean b = this.name.equals(p.name)&&this.age==p.age;
// return b;
// }
// //不是Person型別直接返回false
// return false;
// }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
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;
}
}
Objects類中的equals()方法
package cn.itcast.demo01equals;
import java.util.Objects;
/*
*/
public class DemoObjects {
public static void main(String[] args) {
String s1 = null;
String s2 = "abc";
boolean equals = Objects.equals(s1, s2);//防止丟擲空指標異常Objects類中的equals方法
//靜態方法可以直接用類名.呼叫
//Object類中的equals方法和Objects類中的equals方法的區別
//Object類中的equals方法可能丟擲空指標異常
//而Objects類中的equals方法不會丟擲空指標異常
//原始碼:public static boolean equals(Object a, Object b) {
// return (a == b) || (a != null && a.equals(b));
// }
System.out.println(equals);
}
}