Object類的方法

来源:https://www.cnblogs.com/cjm09/archive/2018/08/05/9419718.html
-Advertisement-
Play Games

在java中,Object類是所有類的超類,所有的類都繼承Object類中的方法。 Object類中有12個成員方法,並沒有顯示聲明任何構造方法,而是存在著預設的無參的構造函數。 Object類源代碼分析: 通過Object類源碼可以看到一些方法用native修飾,使用native修飾符修飾的方法需 ...


在java中,Object類是所有類的超類,所有的類都繼承Object類中的方法。

Object類中有12個成員方法,並沒有顯示聲明任何構造方法,而是存在著預設的無參的構造函數。

Object類源代碼分析:

 1   package java.lang;
 2   
 3   public class Object {
 4     //一個本地方法,具體是用C(C++)在DLL中實現的
 5       private static native void registerNatives();
 6       static {
 7           registerNatives();
 8       }
 9     //返回該Object的運行時類
10       public final native Class<?> getClass();
11    /*
12     對於Object對象來說,返回對象的地址值。但一般在其他類中都會    
13         重寫hashCode方法,使其通過計算得到一個int值(hash值)重寫
14         hashcode方法時必須遵循以下幾點:
15     1、在Java應用的同一次執行過程中,同一對象被多次調用,則他們的
16         hashcode值必然相同。而對於同一個應用的兩次不同的調用,它們的
17         hashcode值可以相同,也有可能不同。
18     2、對於兩個對象來說,如果他們的equals方法比較返回true,那麼這
19         兩個對象的hashcode必然相同。這也解釋了為什麼String類中,如果
20         兩個對象的equals方法相同,則他們的hashcode值一定相同。
21     3、對於兩個對象來說,如果使用equals方法返回為false,則他們的
22         hashcode的值有可能相等也可能不等,(如果不同會提高性能,因為
23         在集合中類判斷兩個對象是否相等,如果其hashcode不等就直接不用
24         判斷equals方法了)
25     4、對於Object對象來說,不同的Object對象的hashcode是不同的,
26         它們返回的是對象的地址,equals返回的也是對象的地址。所以在自
27         己定義的類中如果要添加到集合對象中,最好是要重寫hashcode和
28         equals方法,不然會自動繼承自Object類中的兩個方法根據對象地址
29         來判斷。在重寫自己定義的類時,通常是在類中的根據某個值如
30         name.hashcode();來進行判斷。
31    */
32       public native int hashCode();
33     //Object類中equals方法是比較兩個對象的地址是否相同,而一般我們
34       認為兩個對象中只要屬性相同,這兩個對象就相同。所以一般其他類都 
35       會重寫equals方法
36       public boolean equals(Object obj) {
37           return (this == obj);
38       }
39     //用來另存一個當前存在的對象
40       protected native Object clone() throws      
41       CloneNotSupportedException;
42    //返回一個字元串,用來標識自己
43       public String toString() {
44           return getClass().getName() + "@" + 
45           Integer.toHexString(hashCode());
46       }
47    //喚醒在此對象監視器上等待的單個線程。如果有多個線程等待,則隨
48        機喚醒一個
49       public final native void notify();
50     //喚醒在此對象監視器上等待的所有線程
51       public final native void notifyAll();
52     //在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超
53       過指定的時間量前,導致當前線程等待
54       public final native void wait(long timeout) throws 
55       InterruptedException;
56    /*
57   在其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他
58       某個線程中斷當前線程,或者已超過某個實際時間量前,導致當前線程
59       等待
60   */
61       public final void wait(long timeout, int nanos) throws 
62       InterruptedException {
63           if (timeout < 0) {
64               throw new IllegalArgumentException("timeout value is 
65               negative");
66           }
67   
68           if (nanos < 0 || nanos > 999999) {
69               throw new IllegalArgumentException(
70                                   "nanosecond timeout value out of range");
71           }
72   
73           if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
74               timeout++;
75           }
76   
77           wait(timeout);
78       }
79     /*
80         在其他線程調用此對象的 notify() 方法或 notifyAll() 方法前,導致當 
81         前線程等待。換句話說,此方法的行為就好像它僅執行 wait(0) 調用 
82         一樣。   
83        當前線程必須擁有此對象監視器。該線程發佈對此監視器的所有權並等 
84        待,直到其他線程通過調用 notify 方法,或 notifyAll 方法通知在此對
85        象的監視器上等待的線程醒來。然後該線程將等到重新獲得對監視器的
86        所有權後才能繼續執行。
87        */
88       public final void wait() throws InterruptedException {
89           wait(0);
90       }
91     //當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收
92       器調用此方法
93       protected void finalize() throws Throwable { }
94   }    

通過Object類源碼可以看到一些方法用native修飾,使用native修飾符修飾的方法需要非java語言來實現,比如C,C++。這個特征並非java所特有,很多其它的編程語言都有這一機制,比如在C++中,你可以用extern "C"告知C++編譯器去調用一個C的函數。

在定義一個native method時,並不提供實現體(有些像定義一個java interface),因為其實現體是由非java語言在外面實現的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前期基礎部分的交互方式為: username=input('username: ').strip() print(username,type(username)) ...
  • 1 什麼是變數 量:記錄現實世界中的某種狀態 變:記錄的狀態是需要經常變化的2 為什麼要有變數 程式執行的本質就是一系列狀態的變化,變是程式執行的直接體現, 所以我們需要有一種機制能夠反映或者說是保存下來程式執行時狀態以及狀態的變化。3 如何用變數 3.1、如何定義變數,變數定義分為三部分 變數名: ...
  • 1. 學習計劃 第十二天: 1、購物車實現 2、訂單確認頁面展示 2. 購物車的實現 2.1. 功能分析 1、購物車是一個獨立的表現層工程。 2、添加購物車不要求登錄。可以指定購買商品的數量。 3、展示購物車列表頁面 4、修改購物車商品數量 5、刪除購物車商品 2.2. 工程搭建 e3-cart-w ...
  • 面向對象: ...
  • C++知識庫總結(用來記錄日常接觸到的C++知識點),將會持續更新 ...
  • 1. 分析 構建詞雲需要具備: 原料即文章等內容 將內容進行分詞 將分詞後的內容利用構建詞雲的工具進行構建 保存成圖片 2. 需要的主要模塊 jieba 中文分詞 wordcloud 構建詞雲 3. 模塊原理 wordcloud的實現原理 文本預處理 詞頻統計 將高頻詞以圖片形式進行彩色渲染 jie ...
  • python2.7和python3.6中的tkinter是兩個包,不會自動升級,假如在fedora28做開發的話, 錯誤:用import Tkinter /import tkinter /import _tkinter 都會失敗, 網上的解決辦法: 1.yum install python-tk / ...
  • 程式和進程的區別 進程是動態的,程式是靜態的 進程是暫時的,程式是永久的, 進程是通過程式運行時得到的 程式是一個數據文件,進程是記憶體中動態的運行實體,用來存儲數據段,代碼段,指針等 程式和進程的關係 一個程式可能對應多個進程 一個進程可能包含多個程式,比如一個程式依賴多個其它動態庫時 進程和線程的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...