(Java常用類)Object類

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);
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章