關於clonejava的信息

本文目錄一覽:

Java中clone方法的疑問

因為在java.lang.Object類的定義里,clone()這個方法是protected,

按照protected的訪問控制範圍規定,只能是當前類,或當前包,或其他包的子類,這三種情況能訪問。

注意這裡的」能訪問「都是通過原有對象訪問的。

你可能以為你代碼里obj滿足」其他包的子類「這個條件,錯了,一旦new出來,就脫離了作用域了。而super仍是原有對象,因此可以訪問父類Base乃至Object的保護的clone()方法。

java的clone方法

1.Object中的clone執行的時候使用了RTTI(run-time type identification)的機制,動態得找到目前正在調用clone方法的那個reference,根據它的大小申請內存空間,然後進行bitwise的複製,將該對象的內存空間完全複製到新的空間中去,從而達到shallowcopy的目的。

所以你調用super.clone() 得到的是當前調用類的副本,而不是父類的副本。

2.這句話是J2SE API幫助裡面的話,意思是要讓實例調用clone方法就需要讓此類實現Cloneable介面,API裡面還有句話是:如果在沒有實現 Cloneable 介面的實例上調用 Object 的 clone 方法,則會導致拋出 CloneNotSupportedException 異常,這便是「合法」的含義。 但請注意,Cloneable介面只是個標籤介面,不含任何需要實現的方法,就像Serializable介面一樣。

3. Object.clone()? 不能這麼調用的。

回答還滿意么。

/*——————以下是對問題的補充—悲哀的注釋————*/

ok 請容我慢慢道來

你看到clone()是Object的方法,而Object是所有類的父類,就認為可以用Object調用 clone是么?

但不能使用Object調用clone()方法

原因如下:

1.從你寫法本身來看,Object.clone()肯定不行,因為Object是類, 而clone()是成員方法,所以不能用Object.clone();

2.那麼是不是可以先Object obj=new Object();再obj.clone();或者Object.class.newInstance().clone()呢?還是不行。

clone()對Object類對象本身是不可見的。所以你會發現找不到clone()方法

原因是:clone()方法是protected訪問許可權

方法原型:protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException

而protected許可權的含義是:只對同一包中的類和不同包中的子類及間接子類可訪問,換句話說就是不同包中的非子類或間接子類不能訪問,包含了默認的包訪問許可權。

這個地方容易混淆哦

你可能會問任何類都是Object的子類為什麼不能訪問呢,對,任何類是他的子類也繼承了clone()方法

但請注意,你那句代碼clone()的調用者是誰?是Object本身,即Object對象,正如我們所說,「不同包中的非子類或間接子類不能訪問」,這裡面也包括了父類本身,你調用者是父類,在不同包中,protected成員對父類不可見哦,所以根本不能用object對象調用clone()

綜上,因為在不同包中父類本身不能調用,也找不到protected方法 ,故無法在代碼中使用object直接調用clone()方法,

有點難理解,關鍵在對protected的理解上,因為protected除了本身在繼承上的訪問許可權外,還包含了包訪問許可權,希望回答你還滿意。

java中 clone()方法的使用

final只是不能修改內部值,但是可以修改引用.你a=b.clone();已經把a的引用給修改了!

Java 中 如果clone為什麼必須實現Cloneable介面

因為如果不繼承自Cloneable介面,當調用clone()時會拋出CloneNotSupportedException異常

以下是詳細講解:

   Java的所有類都默認繼承java.lang.Object類,在java.lang.Object類中有一個方法clone()。JDK API的說明文檔解釋這個方法將返回Object對象的一個拷貝。要說明的有兩點:一是拷貝對象返回的是一個新對象,而不是一個引用。二是拷貝對象與用 new操作符返回的新對象的區別就是這個拷貝已經包含了一些原來對象的信息,而不是對象的初始信息。

怎樣應用clone()方法?

一個很典型的調用clone()代碼如下:

class CloneClass implements Cloneable{

 public int aInt;

 public Object clone(){

CloneClass o = null;

try{

 o = (CloneClass)super.clone();

}catch(CloneNotSupportedException e){

 e.printStackTrace();

}

return o;

 }

   有三個值得注意的地方,一是希望能實現clone功能的CloneClass類實現了Cloneable介面,這個介面屬於java.lang 包,java.lang包已經被預設的導入類中,所以不需要寫成java.lang.Cloneable。另一個值得請注意的是重載了clone()方 法。最後在clone()方法中調用了super.clone(),這也意味著無論clone類的繼承結構是什麼樣的,super.clone()直接或 間接調用了java.lang.Object類的clone()方法。下面再詳細的解釋一下這幾點。

應該說第三點是最重要的,仔細 觀察一下Object類的clone()一個native方法,native方法的效率一般來說都是遠高於java中的非native方法。這也解釋了為 什麼要用Object中clone()方法而不是先new一個類,然後把原始對象中的信息賦到新對象中,雖然這也實現了clone功能。對於第二點,也要 觀察Object類中的clone()還是一個protected屬性的方法。這也意味著如果要應用clone()方法,必須繼承Object類,在 Java中所有的類是預設繼承Object類的,也就不用關心這點了。然後重載clone()方法。還有一點要考慮的是為了讓其它類能調用這個clone 類的clone()方法,重載之後要把clone()方法的屬性設置為public。

那麼clone類為什麼還要實現 Cloneable介面呢?稍微注意一下,Cloneable介面是不包含任何方法的!其實這個介面僅僅是一個標誌,而且這個標誌也僅僅是針對 Object類中clone()方法的,如果clone類沒有實現Cloneable介面,並調用了Object的clone()方法(也就是調用了 super.Clone()方法),那麼Object的clone()方法就會拋出CloneNotSupportedException異常。

java 編程clone方法

1、Cloneable介面只是個標記介面,裡面沒有任何實現方法,不實現Cloneable介面也可以使用Object的clone方法

2、任何類都是Object的子類,在子類里當然可以直接調用clone方法,比如super.clone()

3、注意clone方法用native修飾,表明該方法有方法體只是調用的jre外部方法,一般是用C語言實現,其作用是通過jvm和操作系統底層交互

4、參照3

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301529.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-30 16:09
下一篇 2024-12-30 16:09

相關推薦

  • Java 監控介面返回信息報錯信息怎麼處理

    本文將從多個方面對 Java 監控介面返回信息報錯信息的處理方法進行詳細的闡述,其中包括如何捕獲異常、如何使用日誌輸出錯誤信息、以及如何通過異常處理機制解決報錯問題等等。以下是詳細…

    編程 2025-04-29
  • 使用Python爬蟲獲取電影信息的實現方法

    本文將介紹如何使用Python編寫爬蟲程序,來獲取和處理電影數據。需要了解基本的Python編程語言知識,並使用BeautifulSoup庫和Requests庫進行爬取。 一、準備…

    編程 2025-04-28
  • Python爬取網頁信息

    本文將從多個方面對Python爬取網頁信息做詳細的闡述。 一、爬蟲介紹 爬蟲是一種自動化程序,可以模擬人對網頁進行訪問獲取信息的行為。通過編寫代碼,我們可以指定要獲取的信息,將其從…

    編程 2025-04-28
  • 如何使用Python執行Shell命令並獲取執行過程信息

    本文將介紹如何使用Python執行Shell命令並獲取執行過程信息。我們將從以下幾個方面進行闡述: 一、執行Shell命令 Python內置的subprocess模塊可以方便地執行…

    編程 2025-04-28
  • Python實現身份信息模擬生成與查驗

    本文將從以下幾個方面對Python實現身份信息模擬生成與查驗進行詳細闡述: 一、身份信息生成 身份信息生成是指通過代碼生成符合身份信息規範的虛假數據。Python中,我們可以使用f…

    編程 2025-04-27
  • Dapper使用getschema獲取表信息

    本文旨在介紹Dapper中使用getschema獲取表信息的方法和注意事項。 一、獲取某張表的所有列信息 使用Dapper獲取某張表信息,可以使用 `IDbConnection.G…

    編程 2025-04-27
  • 通過提交信息搜索-使用git

    本篇文章重點講解如何使用git通過提交信息來搜索。我們將從多個方面介紹如何使用git來搜索提交信息,並提供相應的代碼示例以供參考。 一、搜索方式 Git提供了三種搜索方式,分別為:…

    編程 2025-04-27
  • 已裝備我軍的空中信息化作戰平台

    本文將會從多個方面詳細闡述已裝備我軍的空中信息化作戰平台。 一、平台概述 已裝備我軍的空中信息化作戰平台是一個全新的作戰系統,具備實時數據採集、處理、分析、共享的能力。它可以在不同…

    編程 2025-04-27
  • Linux查看系統信息

    一、CPU信息 Linux系統下,查看CPU的信息最常用的命令是lscpu。該命令可以顯示CPU架構、核心數量、線程數、緩存大小、CPU頻率等信息。例如: lscpu 該命令會輸出…

    編程 2025-04-24
  • 軟考 信息安全工程師

    軟考 信息安全工程師是一項技能型國家級資格認證考試,主要測試考生在信息安全領域的理論知識和實踐技能,是證明個人信息安全能力的重要證書。本文將從多個方面對軟考 信息安全工程師做詳細的…

    編程 2025-04-23

發表回復

登錄後才能評論