1. 程式人生 > >Java:Object類詳解

Java:Object類詳解

Java 問答:終極父類

Java的一些特性會讓初學者感到困惑,但在有經驗的開發者眼中,卻是合情合理的。例如,新手可能不會理解Object類。這篇文章分成三個部分講跟Object類及其方法有關的問題。

上帝類

問:什麼是Object類?

答:Object類儲存在java.lang包中,是所有java類(Object類除外)的終極父類。當然,陣列也繼承了Object類。然而,介面是不繼承Object類的,原因在這裡指出:Section 9.6.3.4 of the Java Language Specification:“Object類不作為介面的父類”。
Object類中聲明瞭以下函式,我會在下文中作詳細說明。

  • protected Object clone()
  • boolean equals(Object obj)
  • protected void finalize()
  • Class< > getClass()
  • int hashCode()
  • void notify()
  • void notifyAll()
  • String toString()
  • void wait()
  • void wait(long timeout)
  • void wait(long timeout, int nanos)

java的任何類都繼承了這些函式,並且可以覆蓋不被final修飾的函式。例如,沒有final修飾的toString()函式可以被覆蓋,但是final wait()

函式就不行。

問:可以宣告要“繼承Object類”嗎?

答:可以。在程式碼中明確地寫出繼承Object類沒有語法錯誤。參考程式碼清單1。

程式碼清單1:明確的繼承Object

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 importjava.lang.Object; publicclassEmployeeextendsObject { privateString name; public
Employee(String name) { this.name = name; } publicString getName() { returnname; } publicstaticvoidmain(String[] args) { Employee emp =newEmployee("John Doe"); System.out.println(emp.getName()); } }

你可以試著編譯程式碼1(javac Employee.java),然後執行Employee.class(java Employee),可以看到John Doe 成功的輸出了。

因為編譯器會自動引入java.lang包中的型別,即import java.lang.Object; 沒必要宣告出來。Java也沒有強制宣告“繼承Object類”。如果這樣的話,就不能繼承除Object類之外別的類了,因為java不支援多繼承。然而,即使不宣告出來,也會預設繼承了Object類,參考程式碼清單2。

程式碼清單2:預設繼承Object

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 publicclassEmployee { privateString name; publicEmployee(String name) { this.name = name; } publicString getName() { returnname; } publicstaticvoidmain(String[] args) { Employee emp =newEmployee("John Doe"); System.out.println(emp.getName()); } }

就像程式碼清單1一樣,這裡的Employee類繼承了Object,所以可以使用它的函式。

克隆Object

問:clone()函式是用來做什麼的?

答:clone()可以產生一個相同的類並且返回給呼叫者。

問:clone()是如何工作的?

答:Objectclone()作為一個本地方法來實現,這意味著它的程式碼存放在本地的庫中。當代碼執行的時候,將會檢查呼叫物件的類(或者父類)是否實現了java.lang.Cloneable介面(Object類不實現Cloneable)。如果沒有實現這個介面,clone()將會丟擲一個檢查異常()——java.lang.CloneNotSupportedException,如果實現了這個介面,clone()會建立一個新的物件,並將原來物件的內容複製到新物件,最後返回這個新物件的引用。

問:怎樣呼叫clone()來克隆一個物件?

答:用想要克隆的物件來呼叫clone(),將返回的物件從Object類轉換到克隆的物件所屬的類,賦給物件的引用。這裡用程式碼清單3作一個示例。

程式碼清單3:克隆一個物件

1 2 3 4 5 6 7 8 9 10 11 publicclassCloneDemoimplementsCloneable { intx; publicstaticvoidmain(String[] args)throwsCloneNotSupportedException { CloneDemo cd =newCloneDemo(); cd.x =5; System.out.printf("cd.x = %d%n", cd.x); CloneDemo cd2 = (CloneDemo) cd.clone(); System.out.printf("cd2.x = %d%n", cd2.x); } }

程式碼清單3聲明瞭一個繼承Cloneable介面的CloneDemo類。這個介面必須實現,否則,呼叫Object的clone()時將會導致丟擲異常CloneNotSupportedException

CloneDemo聲明瞭一個int型變數x和主函式main()來演示這個類。其中,main()宣告可能會向外丟擲CloneNotSupportedException異常。

Main()先例項化CloneDemo並將x的值初始化為5。然後輸出x的值,緊接著呼叫clone(),將克隆的物件傳回CloneDemo。最後,輸出了克隆的x的值。

編譯程式碼清單3(javac CloneDemo.java)然後執行(java CloneDemo)。你可以看到以下執行結果:

1 2 cd.x = 5 cd2.x = 5

問:什麼情況下需要覆蓋clone()方法呢?

答:上面的例子中,呼叫clone()的程式碼是位於被克隆的類(即CloneDemo類)裡面的,所以就不需要覆蓋clone()了。但是,如果呼叫別的類中的clone(),就需要覆蓋clone()了。否則,將會看到“cloneObject中是被保護的”提示,因為clone()Object中的許可權是protected。(譯者注:protected許可權的成員在不同的包中,只有子類物件可以訪問。程式碼清單3的CloneDemo類和程式碼清單4的Data類是Object類的子類,所以可以呼叫clone(),但是程式碼清單4中的CloneDemo類就不能直接呼叫Data父類的clone())。程式碼清單4在程式碼清單3上稍作修改來演示覆蓋clone()

程式碼清單4:從別的類中克隆物件

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 classDataimplementsCloneable { intx; @Override publicObject clone()throwsCloneNotSupportedException { returnsuper.clone(); } } publicclassCloneDemo { publicstaticvoidmain(String[] args)throwsCloneNotSupportedException { Data data =newData(); data.x =5; System.out.printf("data.x = %d%n", data.x);

相關推薦

JavaObject

Java 問答:終極父類 Java的一些特性會讓初學者感到困惑,但在有經驗的開發者眼中,卻是合情合理的。例如,新手可能不會理解Object類。這篇文章分成三個部分講跟Object類及其方法有關的問題。 上帝類 問:什麼是Object類? 答:Object類

Java併發(十二)CAS Unsafe Atomic 說一說Java的Unsafe 說一說Java的Unsafe Java中Unsafe Unsafe與CAS

一、Unsafe Java無法直接訪問底層作業系統,而是通過本地(native)方法來訪問。不過儘管如此,JVM還是開了一個後門,JDK中有一個類Unsafe,它提供了硬體級別的原子操作。 這個類儘管裡面的方法都是public的,但是並沒有辦法使用它們,JDK API文件也沒有提供任何關於這個類的方法的解

轉載JAVA的StringBuffer

原文: StringBuffer類和String一樣,也用來代表字串,只是由於StringBuffer的內部實現方式和String不同,所以StringBuffer在進行字串處理時,不生成新的物件,在記憶體使用上要優於String類。 所以在實際使用時,

java Io 流

修改 文件目錄 != exe [] 深入 clas one fileinput 關於java 流類的復習;習慣性的復習按照圖結構一層層往下深入去了解去復習,最後通過代碼來實現感覺印象會更深刻一些; 關於 I/O流:IO可以理解為JAVA用來傳遞數據的管道

JavaObject的equals()方法 如何編寫一個完美的equals()方法

urn day lan 匹配 另有 net 現在 isn tar 一 代碼實例: package freewill.objectequals; /** * @author freewill * @see Core Java page161 * @desc getClas

基礎 | Object

「Object類有哪些方法?每個方法分別有什麼作用?」 是面試「Java開發工程師」過程中的高頻問題,我在參加海康威視和VIVO的秋招面試中均被問到過,在此進行一個系統的總結與梳理。 參考答案 Object類位於java.lang包下,是Java中所有類的始祖,其包含的方法

Java併發工具

在JDK的併發包裡提供了幾個非常有用的併發工具類。CountDownLatch、CyclicBarrier和Semaphore工具類提供了一種併發流程控制的手段,Exchanger工具類則提供了線上程間交換資料的一種手段。本章會配合一些應用場景來介紹如何使用這些工具類。 等待多執行緒完成的Cou

Java 的Properties

一、Java Properties類     Java中有個比較重要的類Properties(Java.util.Properties),主要用於讀取Java的配置檔案,各種語言都有自己所支援的配置檔案,配置檔案中很多變數是經常改變的,這樣做也是為了方便使用者,讓使

Java-API-Class、用法及泛化

Java-API-Class類詳解、用法及泛化 轉載宣告: 本文系轉載自以下文章: Java中Class類詳解、用法及泛化 作者: 老白講網際網路 轉載僅為方便學習檢視,一切權利屬於原作者,本人只是做了整理和排版,如果帶來不便請聯絡我刪除。 0x01 摘要

Java中Unsafe

java不能直接訪問作業系統底層,而是通過本地方法來訪問。Unsafe類提供了硬體級別的原子操作,主要提供了以下功能: 1、通過Unsafe類可以分配記憶體,可以釋放記憶體; 類中提供的3個本地方法allocateMemory、reallocateMemory、freeM

java中String

String類 String類存在java.lang包中,專門儲存字串。是引用資料型別。 String類的兩種例項化方法 1.直接賦值 String str1= "hello"; 2.傳統賦值 Str

java之集合

面試常見問題ArrayList和LinkedList的聯絡和區別                  1. ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。                  2. 對於隨機訪問get和set,Ar

java常用集合(有例子,集合糊塗的來看!)

TreeSet:TreeSet是依靠TreeMap來實現的.TreeSet是一個有序集合,TreeSet中元素將按照升序排列,預設是按照自然排序進行排列,意味著TreeSet中元素要實現Comparable介面.我們可以在構造TreeSet物件時,傳遞實現了Comparator介面的比較器物件.java.ut

Java 原子操作(AtomicInteger、AtomicIntegerArray等)

當程式更新一個變數時,如果多執行緒同時更新這個變數,可能得到期望之外的值,比如變數i=1,A執行緒更新i+1,B執行緒也更新i+1,經過兩個執行緒操作之後可能i不等於3,而是等於2。因為A和B執行緒在更新變數i的時候拿到的i都是1,這就是執行緒不安全的更新操作,通常我們會使

Java中Class、用法以及泛化

在前面我們將類的載入的時候,類載入一共有5步,載入,驗證,準備,解析和初始化。其中載入階段,除了將位元組碼載入到方法區,還生成了這個了的Java.lang.Class物件。那麼這個Class物件到底有什麼用呢? 前面的關於反射的文章,我們多次都用到了Class類,可以用這個

OpenCV學習筆記(04)Mat(一)

1. 前言:Mat類簡介 OpenCV 作為強大的計算機視覺開源庫,很大程度上參考了MatLab的實現細節和語法風格,比如說,在OpenCV2.x版本以後,越來越多的函式實現了MatLab所具有的功能,甚至乾脆連函式名都一模一樣(如 imre

java.util.Arrays(原始碼總結)

概述 Arrays類位於java.util包下,是一個對陣列操作的工具類。今天詳細的看了看Arrays類的4千多行原始碼,現將Arrays類中的方法做一個總結(JDK版本:1.6.0_34)。Arrays類中的方法可以分為八類: sort(對陣列排序) b

Java中dimension

dimension - Java的一個類         dimension是Java的一個類,封裝了一個構件的高度和寬度,這個類與一個構件的許多屬性具有相關性,因此在Component類中定義多個與之有關的方法,LayoutManager介面也與一個Dimension

java.security KeyFactory

KeyFactor介紹:java 1.6doc介紹:金鑰工廠用於將金鑰(key型別的不透明金鑰)轉換成金鑰規範(底層金鑰金鑰材料的透明表示),反之亦然,金鑰工廠是雙向的,對於同一個金鑰可以存在多個相容的金鑰規範獲得物件:一般通過靜態方法getInstance()獲得方法:ge

Unsafe--Java中Unsafe

java不能直接訪問作業系統底層,而是通過本地方法來訪問。Unsafe類提供了硬體級別的原子操作,主要提供了以下功能: 1、通過Unsafe類可以分配記憶體,可以釋放記憶體; 類中提供的3個本地方法allocateMemory、reallocateMemory、freeMemory分別用於分配記憶體,