Object類

收藏待读

Object類

Object類

面向對象的核心思想:「找合適的對象,做適合的事情」。

合適的對象:

  • 自己描述類,自己創建對象。
  • sun已經描述了好多常用的類,可以使用這些類創建對象。
  • API(Application Program Interface)

sun定義的那麼多類的終極父類是Object,任何一個類都繼承了Object類。

Object描述的是所有類的通用屬性與方法。

一、Object類常用方法

1.toString()

toString() 返回對象的描述信息 :

[email protected]   
類名@哈希碼值的十六進制形式。

此描述信息不能直觀的展示對象的信息,

父類的指定的功能不能滿足要求,那麼子類可以複寫父類的功能函數。那麼該對象再調用toString()方法時,則會調用子類複寫的toString方法。

重寫toString之後,我們直接輸出一個對象的時候,就會輸出符合我們所需求的數據格式。

package com.hcx;

class Person {
    
    String name;
    int age;
    public Person() {
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

}

class Demo{
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(p);//[email protected]
    }
}

重寫toString方法,按照想要的格式輸出person的信息

package com.hcx;

class Person {
    
    String name;
    int age;
    public Person() {
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return this.name+"-"+this.age;
    }
}

class Demo{
    public static void main(String[] args) {
        Person p = new Person("hcx",23);
        System.out.println(p);//hcx-23
    }
}

2.equals(Object obj)

用於比較兩個對象的內存地址,判斷兩個對象是否為同一個對象。

重寫equals方法:

Object的equals方法默認比較的是兩個對象的內存地址,目前需要比較的是兩個對象的身份證,所以Object類的equals方法不符合現在的需求。

@Override
    public boolean equals(Object obj) { 
        Person p  = (Person)obj;
        return this.id== p.id;
    }

3.hashCode()

返回該對象的哈希碼值:採用操作系統底層實現的哈希算法。

同一個對象的哈希碼值是唯一的。

java中的規範:一般重寫了一個類的equals方法,我們都會重寫它的hashCode方法。

如果兩個對象equals返回true,那麼這兩個對象的hashCode碼必須一致。

class Person{
    
    int id;
    String name;

    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Person() {
    }
    
    @Override
    public String toString() {
        return "編號:"+ this.id + " 姓名:"+this.name;
    }
    
    //為什麼要重寫:Object的equals方法默認比較的是兩個對象的內存地址,我目前需要比較的是兩個對象的身份證,所以Object類的equals方法不符合我現在的需求。
    @Override
    public boolean equals(Object obj) { 
        Person p  = (Person)obj;
        return this.id== p.id;
    }
    
    @Override
    public int hashCode() {
        return  this.id;
    }
}

直接輸出一個對象的時候和輸出對象的toString方法返回的字符串結果是一樣的:

直接輸出一個對象的時候,實際上在println方法內部會調用這個對象的toString方法,把toString方法返回的內容輸出。

public class Demo{

    public static void main(String[] args) {
        
        /*
        Object o = new Object();
        System.out.println(o.toString());  // [email protected]    返回的字符串表示: 完整類名[email protected]+ 對象的哈希碼
        //直接輸出一個對象的時候,實際上在println方法內部會調用這個對象的toString方法,把toString方法返回的內容輸出。
        System.out.println(o);  // [email protected]  
        
        Person  p1 = new Person(110,"小紅");
        System.out.println("p1:"+p1);  
        //如果我們能夠輸出一個p對象的時候,輸出的格式: 編號:110 姓名: 小紅..
        Person  p2 = new Person(112,"小明");
        System.out.println("p2:"+p2);  
        */
        Person p1 = new Person(110,"小紅");
        Person p2 = new Person(110,"小明");
        //需求:在現實生活中只要兩個人的身份證一致,那麼就是同一個人。
        System.out.println("p1與p2是同一個對象嗎?"+ p1.equals(p2));
        
        System.out.println("p1哈希碼:"+ p1.hashCode());
        System.out.println("p2哈希碼:"+ p2.hashCode());
    }
}

原文 : 簡書

相關閱讀

免责声明:本文内容来源于簡書,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。