最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中Object類(lèi)4種方法詳細(xì)介紹

 更新時(shí)間:2022年01月11日 16:27:00   作者:小應(yīng)學(xué)長(zhǎng)  
大家好,本篇文章主要講的是java中Object類(lèi)4種方法詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下,方便下次瀏覽

Object(四大方法):

文章干貨滿(mǎn)滿(mǎn),耐性看完~~
何為Object?
首先先來(lái)看看官方對(duì)Object的介紹:
在這里附上Java官方的查閱工具:https://docs.oracle.com/en/java/javase/17/docs/api/index.html

在這里插入圖片描述

由官方介紹可見(jiàn),object屬于Java.lang包內(nèi)的一個(gè)類(lèi),而且提供了很多種方法, Object 是類(lèi)層次結(jié)構(gòu)的根類(lèi)。每個(gè)類(lèi)都使用 Object 作為超類(lèi)。所有對(duì)象(包括數(shù)組)都實(shí)現(xiàn)這個(gè)類(lèi)的方法。簡(jiǎn)單的說(shuō)Object類(lèi)就是所有類(lèi)的父類(lèi),包括我們所寫(xiě)的類(lèi),我們?cè)谑褂妙?lèi)的時(shí)候就會(huì)利用Object類(lèi)中的方法,之所以我們?cè)谌粘W(xué)習(xí)和開(kāi)發(fā)中見(jiàn)不到object這個(gè)類(lèi),是因?yàn)樗械母割?lèi)都自動(dòng)的繼承了這個(gè)類(lèi),并且擁有object類(lèi)的所有方法,并且可以對(duì)這些方法進(jìn)行重寫(xiě),達(dá)到我們的業(yè)務(wù)需求。

hashCode()方法:

hashCode()介紹:
hashCode() 的作用是獲取哈希碼,也稱(chēng)為散列碼;它實(shí)際上是返回一個(gè)int整 數(shù)。這個(gè)哈希碼的作用是
確定該對(duì)象在哈希表中的索引位置。

用法:

//新建一個(gè)HashTest類(lèi)
public class HashTest {
}

//測(cè)試類(lèi)
public class TestMain {
    public static void main(String[] args) {
        HashTest h = new HashTest();      
        
        int hash = h.hashCode();   //調(diào)用hashCode()方法
        System.out.println(hash);  //輸出可以得到一串整數(shù)
    }
}
//460141958
//這個(gè)數(shù)也就是哈希碼,也稱(chēng)為散列碼,
//作用是確定該對(duì)象在哈希表中的索引位置

equals()方法:

參考官方文檔可知:equals(Object obj),需要傳入一個(gè)對(duì)象
所以這個(gè)方法的作用就是判斷其他對(duì)象是否“等于”此對(duì)象,返回值也就是布爾類(lèi)型。
上代碼:

public class HashTest {
}  //還是使用那個(gè)類(lèi)

public class TestMain {
    public static void main(String[] args) {
        HashTest h1 = new HashTest();
        HashTest h2 = new HashTest();  //用一個(gè)類(lèi)去創(chuàng)建兩個(gè)對(duì)象,判斷是否相等

        System.out.println(h1.equals(h2));  //語(yǔ)法:h1.equals(h2)
    }
}

//結(jié)果:false

到這里,很多人就會(huì)有疑問(wèn)了,同樣的一個(gè)類(lèi)去創(chuàng)建兩個(gè)對(duì)象,為什么會(huì)不一樣呢?
OK,首先我們看一下equals的源碼,看看它的判斷原理是什么:
//equals源碼
   public boolean equals(Object obj) {
        return (this == obj);
    }
源碼很簡(jiǎn)單,不就是兩個(gè)==號(hào),但是我們知道類(lèi)的引用類(lèi)型的數(shù)據(jù),而用兩個(gè)等于號(hào)去判斷兩個(gè)引用類(lèi)型,是去判斷兩者的內(nèi)存地址是否相同,當(dāng)一個(gè)類(lèi)去new一個(gè)新對(duì)象時(shí),是在堆內(nèi)存內(nèi)開(kāi)辟了一個(gè)新的空間,當(dāng)去創(chuàng)建兩個(gè)或者多個(gè)類(lèi)的時(shí)候,每個(gè)類(lèi)肯定有屬于自己的空間,所有也有一個(gè)獨(dú)一無(wú)二的地址,這就是為什么這個(gè)判斷為什么不成立的原因。
但是比較對(duì)象的引用對(duì)于我們?cè)趯?shí)際開(kāi)發(fā)中沒(méi)有意義,我們一般還是要重寫(xiě)該方法,比如去判斷兩者的參數(shù)是否相等:
public class HashTest {

    private int age;

    public HashTest() {
    }

    public HashTest(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

//重寫(xiě)equals方法,只要HashTest生成的對(duì)象,傳入age參數(shù)相等,即可判斷兩者一致
//重寫(xiě)后的equals,就不在是去判斷兩者的地址是否相同 
    @Override
    public boolean equals(Object obj){
        HashTest h = (HashTest) obj;    //多態(tài)
        if(this.age == h.getAge()) {
            return true;
        }
        return false;
    }
}

//測(cè)試類(lèi):
public class TestMain {
    public static void main(String[] args) {
        HashTest h1 = new HashTest(5);
        HashTest h2 = new HashTest(5);

        System.out.println(h1.equals(h2));
    }
}

//結(jié)果:true

//若吧其中一個(gè)age改成6:
public class TestMain {
    public static void main(String[] args) {
        HashTest h1 = new HashTest(5);
        HashTest h2 = new HashTest(6);

        System.out.println(h1.equals(h2));
    }
}
//結(jié)果:flase

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

== : 它的作用是判斷兩個(gè)對(duì)象的地址是不是相等。即,判斷兩個(gè)對(duì)象是不是同 一個(gè)對(duì)象。
(基本數(shù)據(jù)類(lèi)型== 比較的是值,引用數(shù)據(jù)類(lèi)型 == 比較的是內(nèi)存地址)

equals() : 它的作用也是判斷兩個(gè)對(duì)象是否相等。但它一般有兩種使用情況:
情況1:類(lèi)沒(méi)有重寫(xiě)equals() 方法。則通過(guò) equals() 比較該類(lèi)的兩個(gè)對(duì)象時(shí), 等價(jià)于通過(guò)“==”比較這兩個(gè)對(duì)象。
情況2:類(lèi)重寫(xiě)了 equals() 方法。一般,我們都覆蓋 equals() 方法來(lái)兩個(gè)對(duì)象 的內(nèi)容相等;若它們的內(nèi)
容相等,則返回 true (即,認(rèn)為這兩個(gè)對(duì)象相等)

hashCode()與equals()的相關(guān)規(guī)定:

如果兩個(gè)對(duì)象相等,則hashcode一定也是相同的 兩個(gè)對(duì)象相等,對(duì)兩個(gè)對(duì)象分別調(diào)用equals方法都返
回true, 兩個(gè)對(duì)象有相同的hashcode值,它們也不一定是相等的。因此,equals 方法被重寫(xiě)過(guò),則 hashCode 方法也必須被重寫(xiě),hashCode() 的默認(rèn)行為是對(duì)堆上的對(duì)象產(chǎn)生獨(dú)特值。如果沒(méi)有重寫(xiě)hashCode(),則該 class 的兩個(gè)對(duì)象無(wú)論如何都不會(huì)相等(即使這兩個(gè)對(duì)象指 向相同的數(shù)據(jù))

getClass()方法:

返回此 Object 運(yùn)行時(shí)的類(lèi),,獲取對(duì)象的真實(shí)類(lèi)的全名稱(chēng)
比如在使用多態(tài)時(shí),父類(lèi)引用變量,使用getClass()方法就可以看到真實(shí)的類(lèi):

public class HashTest {
}

//測(cè)試類(lèi)
public class TestMain {
    public static void main(String[] args) {
        HashTest h1 = new HashTest();

        System.out.println(h1.getClass());  //調(diào)用getClass()
    }
}

輸出值:class HashTest
這個(gè)就比較好理解,簡(jiǎn)單的說(shuō)就是看當(dāng)時(shí)使用該方法的對(duì)象,到底是哪個(gè)類(lèi)。
還有一個(gè)應(yīng)用場(chǎng)景,在使用多態(tài)的時(shí)候,在代碼多的時(shí)候我們做不到用肉眼去找這個(gè)多態(tài)是用哪子類(lèi),即使找得到,也很浪費(fèi)時(shí)間,那么getClass()方法就派上用場(chǎng)了:
//在polymorphismTest包下創(chuàng)建了Person類(lèi),作為父類(lèi)
package polymorphismTest;
public class Person {
    public void eat(){
        System.out.println("我會(huì)吃飯");
    }
}


//創(chuàng)建Student類(lèi),繼承Person
package polymorphismTest;
public class Student extends Person{

    @Override    //重寫(xiě)父類(lèi)eat方法
    public void eat(){
        System.out.println("我是學(xué)生,我也還吃飯");
    }
}


//測(cè)試類(lèi)
package polymorphismTest;
public class TestMain {
    public static void main(String[] args) {

        Person p = new Student();    //使用多態(tài)
        p.eat();                     //這里其實(shí)就是使用了Student子類(lèi)的方法
        System.out.println(p.getClass());  //查看p到底是什么類(lèi)
    }
}

//輸出結(jié)果:
//我是學(xué)生,我也還吃飯
//class polymorphismTest.Student

用父類(lèi)去引用子類(lèi)的方法時(shí),可以執(zhí)行子類(lèi)的方法,當(dāng)用getClass()方法去查看,結(jié)果也是Student子類(lèi)
不使用多態(tài),使用類(lèi)本身去創(chuàng)建對(duì)象時(shí):
package polymorphismTest;

public class TestMain {
    public static void main(String[] args) {
    
        Person p = new Person();  //當(dāng)這里不使用多態(tài),而是使用本身的時(shí)候
        p.eat();
        System.out.println(p.getClass());
    }
}

//我會(huì)吃飯
//class polymorphismTest.Person
//這里返回的就是Person類(lèi)了

toString()方法:

返回一個(gè)字符串來(lái)標(biāo)識(shí)當(dāng)前對(duì)象
對(duì)于這個(gè)方法,我們先來(lái)看看toString()源碼:

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
其實(shí)也很簡(jiǎn),就是 類(lèi)名+符號(hào)@+對(duì)象的哈希碼值
public class TestMain {
    public static void main(String[] args) {

        Person p = new Person();
        System.out.println(p.toString());
    }
}
//結(jié)果:polymorphismTest.Person@1b6d3586
但是這個(gè)返回值視乎沒(méi)什么意義,所以,為了返回值有更多的意義,我們可以重寫(xiě)這個(gè)方法

總結(jié)

到此這篇關(guān)于java中Object類(lèi)4種方法詳細(xì)介紹的文章就介紹到這了,更多相關(guān)java Object類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

永新县| 博兴县| 辰溪县| 固原市| 房山区| 大港区| 天气| 宁晋县| 盘山县| 乌拉特中旗| 阿尔山市| 天津市| 华亭县| 开原市| 卓尼县| 高台县| 那坡县| 东台市| 高雄县| 定边县| 十堰市| 乌拉特后旗| 新竹县| 广水市| 洮南市| 峨眉山市| 怀化市| 宁安市| 喀什市| 五河县| 正定县| 珠海市| 阿图什市| 东源县| 通化市| 谷城县| 卓尼县| 通榆县| 利津县| 梁平县| 江北区|