欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java進(jìn)階之Object類及常用方法詳解

 更新時(shí)間:2023年01月06日 09:56:57   作者:橙子!  
Object?類是?Java?默認(rèn)提供的一個(gè)類,是所有?Java?類的祖先類,每個(gè)類都使用?Object?作為父類。本文就來和大家聊聊Object類的常用方法,希望對大家有所幫助

1. Object類

Object 類是 Java 默認(rèn)提供的一個(gè)類,是所有 Java 類的祖先類,每個(gè)類都使用 Object 作為父類。

那么我們就可以使用 Object 類的引用變量指向任何類的對象。在沒有明確給出一個(gè)類的父類時(shí),Java 默認(rèn)把 Object 類作為該類的父類,繼承了 Object 類的所有方法。

示例:

public class Test {
    public static void main(String[] args) {
        function(new Person());
        function(new Student());
    }
    public static void function(Object obj){
        System.out.println(obj);
    }
}
class Person{
    private int age;
    private String name;
}
class Student{
    private int grade;
    private String sno;
}

在上面創(chuàng)建了兩個(gè)不同類型的對象,并且作為實(shí)參傳遞給了 function 方法,此時(shí)相當(dāng)于:

Object obj =new Person();

輸出的是對象引用的值,也就是其指向?qū)ο蟮牡刂贰?/p>

2. 常用的方法

Object 類中提供了一些方法,其中常用的方法有 toString() 方法,equals() 方法,hashcode() 方法等。在使用前導(dǎo)入 Object 類:

import java.util.Objects;

2.1 toString 方法

JDK源碼中的toString方法:

//Object類中的toString()方法實(shí)現(xiàn):
 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

toString() 方法定義在 Object 類中,返回值是 String 類型,根據(jù)調(diào)用它的對象返回類名和它的引用地址。

示例:

public class Test {
    public static void main(String[] args) {
        Person person=new Person();
        System.out.println(person.toString());
        System.out.println(person);
    }
}

class Person{
    public String name;
}

在我們打印對象的引用時(shí),實(shí)際上是默認(rèn)調(diào)用了這個(gè)對象的toString方法。返回此對象所在的類及對應(yīng)的堆空間對象實(shí)體的首地址值。

該方法一般要重寫后使用,一般重寫是將類的對象的屬性返回。在沒有被重寫時(shí),返回的字符串格式是 類名@哈希值,哈希值是十六進(jìn)制的。示例:

public class Test {
    public static void main(String[] args) {
        Person person=new Person();
        System.out.println(person.toString());
        System.out.println(person);
    }
}

class Person{
    private String name="張三";
    private int age=20;
    public String toString(){
        return "Person:name "+name+"  age "+age;
    }
}
/*
Person:name 張三age 20
Person:name 張三age 20
 */

2.2 equals 方法

JDK 源碼中的equals()方法:

// Object類中的equals方法
    ?
public boolean equals(Object obj){
    ?return (this == obj);
    // 使用引用中的地址直接來進(jìn)行比較  
    }

equal()方法定義在 Object 類中,返回值是 boolean 類型,其作用是比較兩個(gè)對象在堆區(qū)的地址是否相同。示例:

public class Test {
    public static void main(String[] args) {
        Person person1=new Person("張三",18);
        Person person2=new Person("李四",20);
        boolean b=person1.equals(person2);
        System.out.println(b);
    }
}

class Person{
    private String name;
    private int age;
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }
}
/*
false
 */

需要注意的是比較的是兩個(gè)引用的值是否相同,即引用執(zhí)行的地址。如果想要比較對象中的內(nèi)容,可以重寫該方法實(shí)現(xiàn)。示例:

public class Test {
    public static void main(String[] args) {
        Person person1=new Person("張三",18);
        Person person2=new Person("張三",18);
        boolean b=person1.equals(person2);
        System.out.println(b);
    }
}

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

    @Override
    public boolean equals(Object obj) {
        //判斷是否為空
        if (obj == null) {
            return false ;
        } if(this == obj) {
            return true ;
        }
        // 不是Person類對象
        if (!(obj instanceof Person)) {
            return false ;
        }
        Person per = (Person) obj ; // 向下轉(zhuǎn)型,比較屬性值
        //此時(shí)比較時(shí)按照重寫后的equal()方法的規(guī)則
        return this.name.equals(per.name) && this.age==per.age ;
    }
}
/*
true
 */

此時(shí),我們重寫了equals()方法,用來比較對象中的內(nèi)容是否相同,這部分比較難,可以仔細(xì)推敲這段代碼,理解其含義。

2.3 hashcode 方法

JDK源碼中的hashcode()方法:

public native int hashCode();

hashcode()方法定義在Object類中,用于放回對象的 hash 代碼值,確定對象在內(nèi)存中存儲的位置是否相同。

重寫該方法使用:

import java.util.Objects;

public class Test {
    public static void main(String[] args) {
        Person person1=new Person("張三",18);
        Person person2=new Person("張三",18);
        System.out.println(person1.hashCode());
        System.out.println(person2.hashCode());
    }
}

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

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
/*
24022538
24022538
*/

事實(shí)上 hashCode() 在散列表中才有用,在其它情況下沒用,在散列表中hashCode() 的作用是獲取對象的散列碼,進(jìn)而確定該對象在散列表中的位置。

3. 注意事項(xiàng)

重寫 equals() 方法時(shí),也必須重寫 hashcode() 方法嗎?

答:必須,hashCode 和 equals 兩個(gè)方法是用來協(xié)同判斷兩個(gè)對象是否相等的,采用這種方式的原因是可以提高程序插入和查詢的速度,當(dāng)重寫equals方法后有必要將hashCode方法也重寫,這樣做才能保證不違背hashCode方法中相同對象必須有相同哈希值的約定。

== 和 equals 的區(qū)別是什么?

答:對于基本類型和引用類型 == 的作用效果是不同的,如下所示:

基本類型:比較的是值是否相同;

引用類型:比較的是引用是否相同

例如在比較兩個(gè)字符串時(shí):

public class Test {
    public static void main(String[] args) {
       String s1=new String("HelloWorld");
       String s2=new String("HelloWorld!");
       String s3="HelloWorld";
       System.out.println(s1.equals(s2));
       System.out.println(s1.equals(s3));
    }
}

運(yùn)行結(jié)果是

false
true

為什么會出現(xiàn)這樣的結(jié)果呢?這里就引出了一個(gè)新的概念,字符串常量值。字符串有兩種賦值方式,一種是字面值的方式賦值,另一種是 new 一個(gè)新的對象,這兩種方式在性能和內(nèi)存方面都存在差異。

當(dāng)使用字面值的方式創(chuàng)建一個(gè)對象時(shí),JVM 會在字符串常量池中尋找是否存在這個(gè)對象 "HelloWorld",如果不存在,則創(chuàng)建這個(gè)對象,并將這個(gè)對象的引用地址返回給字符串常量 s3,如果存在,則不創(chuàng)建對象,直接返回池中這個(gè)對象的地址。這樣我們就不難理解上面這段的代碼為什么會出現(xiàn)這樣的情況了!

4. 總結(jié)

Object 類是 Java 默認(rèn)提供的一個(gè)類,是所有 Java 類的祖先類,每個(gè)類都使用Object作為父類。Object 類中提供了一些方法,這些方法為了達(dá)到想要的效果,我們一般在類中重寫使用!

到此這篇關(guān)于Java進(jìn)階之Object類及常用方法詳解的文章就介紹到這了,更多相關(guān)Java Object類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論