1. 程式人生 > 其它 >Java整理十一 Object類中的toString()方法與equals()方法 Objects類

Java整理十一 Object類中的toString()方法與equals()方法 Objects類

技術標籤:筆記

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