国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

作為所有類的頂層父類,沒想到Object的魔力如此之大!

這篇具有很好參考價值的文章主要介紹了作為所有類的頂層父類,沒想到Object的魔力如此之大!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

寫在開頭

在上一篇博文中我們提到了Java面向對象的四大特性,其中談及“抽象”特性時做了一個引子,引出今天的主人公Object,作為所有類的頂級父類,Object被視為是James.Gosling的哲學思考,它高度概括了事務的自然與社會行為。

源碼分析

跟進Object類的源碼中我們可以看到,類的注釋中對它做了一個總結性的注釋。
作為所有類的頂層父類,沒想到Object的魔力如此之大!

在Object的內部主要提供了這樣的11種方法,大家可以在源碼中一個個的跟進去看,每個方法上均有詳細的英文注釋,養(yǎng)成良好的看英文注釋習慣,是一個合格程序員的必備基礎技能哈。

/**
 * 方法一
 */
public final native Class<?> getClass()
/**
 * 方法二
 */
public native int hashCode()
/**
 *方法三
 */
public boolean equals(Object obj)
/**
 * 方法四
 */
protected native Object clone() throws CloneNotSupportedException
/**
 * 方法五
 */
public String toString()
/**
 * 方法六
 */
public final native void notify()
/**
 * 方法七
 */
public final native void notifyAll()
/**
 * 方法八
 */
public final native void wait(long timeout) throws InterruptedException
/**
 * 方法九
 */
public final void wait(long timeout, int nanos) throws InterruptedException
/**
 * 方法十
 */
public final void wait() throws InterruptedException
/**
 * 方法十一
 */
protected void finalize() throws Throwable { }

getClass()

getClass()是Java的一個native 方法,用于返回當前運行時對象的 Class 對象,使用了 final 關鍵字修飾,故不允許子類重寫。在源碼中我們可以到,該方法的返回是Class類。
Class 類存放類的結構信息,能夠通過 Class 對象的方法取出相應信息:類的名字、屬性、方法、構造方法、父類、接口和注解等信息。

hashCode()

同樣是native 方法,用于返回對象的哈希碼,主要使用在哈希表中,比如 JDK 中的HashMap。

equals()

默認比較對象的地址值是否相等,子類可以重寫比較規(guī)則,如String 類對該方法進行了重寫以用于比較字符串的值是否相等。

clone()

native 方法,用于創(chuàng)建并返回當前對象的一份拷貝。

toString()

返回類的名字實例的哈希碼的 16 進制的字符串。建議 Object 所有的子類都重寫這個方法。

notify()

native 方法,并且不能重寫。喚醒一個在此對象監(jiān)視器上等待的線程(監(jiān)視器相當于就是鎖的概念)。如果有多個線程在等待只會任意喚醒一個。

notifyAll()

native 方法,并且不能重寫。跟 notify 一樣,唯一的區(qū)別就是會喚醒在此對象監(jiān)視器上等待的所有線程,而不是一個線程。

wait(long timeout)

native方法,并且不能重寫。暫停線程的執(zhí)行。注意:sleep 方法沒有釋放鎖,而 wait 方法釋放了鎖 ,timeout 是等待時間。

wait(long timeout, int nanos)

多了 nanos 參數(shù),這個參數(shù)表示額外時間(以納秒為單位,范圍是 0-999999)。 所以超時的時間還需要加上 nanos 納秒。

wait()

讓持有對象鎖的線程進入等待,不可設置超時時間,沒有被喚醒的情況下,會一直等待。

finalize()

實例被垃圾回收器回收的時候觸發(fā)的操作

高頻面試考點總結

雖然在日常的代碼開發(fā)中,我們很少會直接使用Object類,但考慮到它的獨特地位,與此相關的面試考點還是不少的,我們今天總結一下。

1.淺拷貝、深拷貝、引用拷貝的區(qū)別?

淺拷貝:基本類型的屬性會直接復制一份,而引用類型的屬性復制:復制棧中的變量和變量指向堆內存中的對象的指針,不復制堆內存中的對象,也就是說拷貝對象和原對象共用同一個內部對象。
作為所有類的頂層父類,沒想到Object的魔力如此之大!

深拷貝:深拷貝會完全復制整個對象,包括這個對象所包含的內部對象。
作為所有類的頂層父類,沒想到Object的魔力如此之大!

引用拷貝:簡單來說,引用拷貝就是兩個不同的引用指向同一個對象。
作為所有類的頂層父類,沒想到Object的魔力如此之大!

2.Java中如何實現(xiàn)淺拷貝與深拷貝

其實實現(xiàn)淺拷貝很簡單,實現(xiàn) Cloneable 接口,重寫 clone() 方法,在clone()方法中調用父類Object的clone()方法。

public class TestClone {
 
    public static void main(String[] args) throws CloneNotSupportedException {
        Person p1 = new Person(1, "ConstXiong");//創(chuàng)建對象 Person p1
        Person p2 = (Person)p1.clone();//克隆對象 p1
        p2.setName("其不答");//修改 p2的name屬性,p1的name未變
        System.out.println(p1);
        System.out.println(p2);
    }
    
}
 
/**
 * person類
 */
class Person implements Cloneable {
    
    private int pid;
    
    private String name;
    
    public Person(int pid, String name) {
        this.pid = pid;
        this.name = name;
        System.out.println("Person constructor call");
    }
 
    public int getPid() {
        return pid;
    }
 
    public void setPid(int pid) {
        this.pid = pid;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
 
    @Override
    public String toString() {
        return "Person [pid:"+pid+", name:"+name+"]";
    }
    
}

那么如何實現(xiàn)深拷貝呢,這里給出兩種方法
方法一:將對象的屬性的Class 也實現(xiàn) Cloneable 接口,在克隆對象時也手動克隆屬性。
方法二:結合序列化(JDK java.io.Serializable 接口、JSON格式、XML格式等),完成深拷貝。

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

**區(qū)別**
== 是關系運算符,equals() 是方法,結果都返回布爾值
Object 的 == 和 equals() 比較的都是地址,作用相同

**== 作用:**
基本類型,比較值是否相等
引用類型,比較內存地址值是否相等
不能比較沒有父子關系的兩個對象

**equals()方法的作用:**
JDK 中的類一般已經(jīng)重寫了 equals(),比較的是內容
自定義類如果沒有重寫 equals(),將調用父類(默認 Object 類)的 equals() 方法,Object 的 equals() 比較使用了 this == obj
可以按照需求邏輯,重寫對象的 equals() 方法(重寫 equals 方法,一般須重寫 hashCode 方法)

4.為什么說重寫equals方法也要重寫hashCode方法呢?

equals()方法是用來判斷兩個對象是否相等的重要方法,Object中默認比較地址,但這在實際使用上意義不大,比如兩個字符串,我們比較的初衷肯定是他們的字符串內容是否相等,而不是內存地址,典型的就是String內部的重寫equals。

hashCode()方法是一個C或C++實現(xiàn)的本地方法,用以獲取對象的哈希碼值(散列碼),通過碼值可以確定該對象在哈希表中的索引位置,是通過線程局部狀態(tài)來實現(xiàn)的隨機數(shù)值。子類可通過重寫該方法去重新設計hash值。
使用hashCode方法可以一定程度上判斷兩個對象是否相等,因為,若兩個對象相等,那么他們所在的索引位置肯定就一樣,這時hashCode獲取的哈希碼自然也就一樣,但這個條件反過來就不一定成立了,哈希碼相等的兩個對象不一定相等,因為存在哈希碰撞 。

看完這兩個方法的特點,我們大概可以明白了,確保兩個對象是否真正相等,需要這個兩個方法的協(xié)作,equals是邏輯上的相等,hashCode是物理上的相等,若我們在重寫equals()方法時,不去重寫配套的hashCode方法,就會導致兩個對象在邏輯上相等,但物理上不等,這會帶來很多問題,譬如集合類HashMap的底層實現(xiàn)是數(shù)據(jù)+鏈表/紅黑樹的方式,通過計算hash尋找位置,通過equals判斷元素相等,這時候若僅重寫equals的話,hash不重寫,就會出現(xiàn)邏輯上我們認為相等的兩個數(shù),存在了不同的位置上,造成混亂的場面。文章來源地址http://www.zghlxwxcb.cn/news/detail-788587.html

到了這里,關于作為所有類的頂層父類,沒想到Object的魔力如此之大!的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 沒想到還有這種騷操作~如何使用Golang實現(xiàn)無頭瀏覽器截圖?

    在Web開發(fā)中,有時需要對網(wǎng)頁進行截圖,以便進行頁面預覽、測試等操作。 而使用無頭瀏覽器來實現(xiàn)截圖功能,可以避免手動操作的繁瑣和不穩(wěn)定性。 這篇文章將介紹: 使用Golang進行無頭瀏覽器的截圖,輕松實現(xiàn)頁面預覽、測試和模擬用戶操作。 這篇文章發(fā)完,有朋友在朋

    2024年02月05日
    瀏覽(25)
  • 真沒想到??!無需服務器,五分鐘部署公眾號機器人

    真沒想到??!無需服務器,五分鐘部署公眾號機器人

    大家好,我是編程哥。一個尋求破圈,不斷淬煉自己的人,關注我一起進步。 目前各大模型都比較火,作為一名程序員,對大模型的了解也是蠢蠢欲動,尤其是對于機器人自動問答這一項。所以在朋友的推薦下,了解了一個無需服務器,快速搭建公眾號機器人的教程,現(xiàn)在分

    2024年02月03日
    瀏覽(21)
  • 沒想到,JDBC 驅動會偷偷修改 sql_mode 的會話值

    最近碰到一個 case,值得分享一下。 現(xiàn)象就是一個 update 操作,在 mysql 客戶端中執(zhí)行提示 warning,但在 java 程序中執(zhí)行卻又報錯。 update 語句中使用 STR_TO_DATE 函數(shù)將字符串轉換為日期時間格式。 但因為這個格式字符串 \\\'%Y-%m-%d %H:%i:%s\\\' 沒有對日期字符串中的毫秒部分 .0 進行解析

    2024年03月09日
    瀏覽(25)
  • 云安全_什么是云,云計算的本質,沒想到一個Handler還有中高級幾種問法

    云安全_什么是云,云計算的本質,沒想到一個Handler還有中高級幾種問法

    是將計算機終端系統(tǒng)進行虛擬化,以達到桌面使用的安全性和靈活性??梢酝ㄟ^任何設備,在任何地點,任何時間通過網(wǎng)絡訪問屬于我們個人的桌面系統(tǒng)。 存儲虛擬化 是對存儲硬件資源進行抽象化表現(xiàn)。 網(wǎng)絡虛擬化 網(wǎng)絡虛擬化就是在一個物理網(wǎng)絡上模擬出多個邏輯網(wǎng)絡來。

    2024年04月13日
    瀏覽(25)
  • [鏈表OJ題 8] 用棧實現(xiàn)隊列,沒想到你小子的基礎這么好,這么快就做對了

    [鏈表OJ題 8] 用棧實現(xiàn)隊列,沒想到你小子的基礎這么好,這么快就做對了

    目錄 題目來源: 代碼實現(xiàn): 思路分析: 實現(xiàn)過程: 力扣 - 232.用棧實現(xiàn)隊列 題目描述: 我們這里的棧已經(jīng)寫好了,如果對棧還不是很懂的可以看看這篇文章:CSDN - [數(shù)據(jù)結構 -- C語言] 棧(stack) 我們知道 隊列的特性:先入先出;棧的特性:先入后出。 因此我們定義兩個棧

    2024年02月06日
    瀏覽(32)
  • 5年測試經(jīng)驗怎么著我也能要個20K吧?沒想到被阿里P8問傻了

    都說金三銀四是跳槽漲薪季,我也是著急忙慌的準備簡歷—— 5年軟件測試經(jīng)驗,可獨立測試大型產(chǎn)品項目,熟悉項目測試流程…薪資要求?5年測試經(jīng)驗起碼能要個20K吧? 我加班肝了一頁半簡歷,投出去一周,面試電話倒是不少,自信滿滿去面試,現(xiàn)場被問了這么幾個問題—

    2024年02月08日
    瀏覽(19)
  • 5年測試經(jīng)驗怎么著我也能要個20K吧?沒想到被阿里P8問傻了····

    5年測試經(jīng)驗怎么著我也能要個20K吧?沒想到被阿里P8問傻了····

    都說金三銀四是跳槽漲薪季,我也是著急忙慌的準備簡歷—— 5年軟件測試經(jīng)驗,可獨立測試大型產(chǎn)品項目,熟悉項目測試流程…薪資要求?5年測試經(jīng)驗起碼能要個20K吧? 我加班肝了一頁半簡歷,投出去一周,面試電話倒是不少,自信滿滿去面試,現(xiàn)場被問了這么幾個問題—

    2024年02月08日
    瀏覽(21)
  • [Lua] 實現(xiàn)所有類的基類Object、模擬單繼承OO、實現(xiàn)抽象工廠

    Lua 沒有嚴格的 oo(Object-Oriented)定義,可以利用元表特性來實現(xiàn) 先定義所有類的基類,即 Object 類。代碼順序從上到下,自成一體。完整代碼 定義一個空表 Object , __index 指向其自身(繼承將直接使用該表作為對象的元表) new 定義構造對象時的初始化行為,相當于 構造器

    2024年02月11日
    瀏覽(23)
  • Python中的super:調用父類的構造方法

    Python中的super:調用父類的構造方法

    ?在子類構造方法中調用父類構造方法的兩種方式: 1、未綁定的方法: 直接使用父類名來進行調用 ,即‘父類名.父類方法名(self,[參數(shù)1, 參數(shù)2,...])’ 2、 super() : 如果涉及多繼承,該函數(shù)只能調用第一個直接父類的構造方法。super().父類方法名(self, [參數(shù)1, 參數(shù)2,...])或supe

    2024年02月15日
    瀏覽(22)
  • 【iOS開發(fā)】理解OC的類,父類,元類的關系

    【iOS開發(fā)】理解OC的類,父類,元類的關系

    在OC中,有對象objc,有類Class,有父類SuperClass,其實還有一種元類MetaClass。在接下來的RunLoop,消息轉發(fā)機制的學習之前需要知道OC類和對象的底層,所以理解類, 父類,元類的關系是基礎 在 Objective-C 中,類是對象的模板或藍圖,而對象則是類的實例。每個對象都有一個類作

    2024年02月03日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包