Cloneable介面與Clone方法
Object類中有一clone()方法,定義如下:
protected native Object clone() throws CloneNotSupportedException;
為native方法,且訪問許可權為protected(包內及其子類)。
jdk官方文件建議,對於任意物件x,表示式 x.clone() != x 為true、x.clone().equals(x) 為true、x.clone().getClass() == x.getClass() 為true,但這並不是必須的。
對於在任何物件上呼叫clone()方法,其class必須實現Cloneable介面,否則會丟擲CloneNotSupportedException異常。
native clone()方法往往會建立一個物件例項,並且拷貝物件內部的資料結構,但這個過程沒有呼叫構造器。
Object類的native clone方法預設為淺拷貝(shallow copy),即物件引用型別的成員會拷貝指標值。
如果需要自定義一些拷貝物件的成員,可以通過呼叫super.clone()得到拷貝物件,之後自行修改物件的成員後再將其return。
相關推薦
Cloneable介面與Clone方法
Object類中有一clone()方法,定義如下: protected native Object clone() throws CloneNotSupportedException; 為native方法,且訪問許可權為protected(包內及其子類)
“全棧2019”Java第六十三章:介面與抽象方法詳解
難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第六十三章:介面與抽象方法詳解 下一章 “全棧2019”Java第六十四章:介面與靜態方法詳
讀書筆記-《Effective Java》第10、11條:覆蓋toString方法與clone方法
第10條 始終要覆蓋toString方法 提供合適的輸出,會經常用到。 第11條 謹慎地覆蓋clone 特別注意(謹慎的源頭) 如果直接使用super.clone(),那麼基本資料型別會複製,但是物件、陣列這種型別就會只複製引用。 也就是說如果修改clo
java基礎學習總結(七):Cloneable介面和Object的clone()方法
為什麼要克隆 為什麼要使用克隆,這其實反映的是一個很現實的問題,假如我們有一個物件: public class SimpleObject implements Cloneable { private String str; public SimpleObject()
關於 Cloneable 介面 和 重寫 Object.clone() 方法的嘗試順便複習深拷貝和淺拷貝
一個類如果想重寫 Object 的 clone 方法,則必須實現 Cloneable 介面,否則呼叫 clone 方法時將會丟擲 CloneNotSupportException 異常 /** * Author: heatdeath * Date:
PHP學習——28 PHP面向物件(抽象類與抽象方法、介面的實現)
一、抽象類與抽象方法 <?php // 任何一個類,如果它裡面至少有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的。 abstract class Person // 定義為抽象的類不能被例項化。 { public $name; public function __co
PHP學習——26 PHP面向物件(物件的克隆clone與魔術方法__call、__callStatic)
一、物件的拷貝 <?php // 1.物件的拷貝 class Demo { public $name = 'Tonny'; } $demo1 = new Demo(); $demo2 = $demo1; // 引用賦值,實際上$demo1和$demo1指向同一個物件 $demo3
與 HttpSessionListener 介面有關的方法是?
與 HttpSessionListener 介面有關的方法是() A.sessionInitialized() B.sessionCreated() C.sessionFinialized() D.sessionDestroyed() 答:BD 介面HttpSessionListener有兩
Java中類的比較與排序方法(應用Comparable介面與Comparator介面)
引言 在平時寫Java的程式的時候,如果要進行一些基本型別的變數的比較,可以很方便得呼叫’Math.max()’、Math.min()等方法,如果要對陣列或者列表進行排序,也可以用Arrays.sort()和Collections.sort()等已經封裝好的方法來進行。但是,如果是一個自
java面向物件——介面與方法實現
介面與方法實現 關鍵字interface implements public interface Smoking { public abstract void smoke(); } public 
Map介面containsKey與get方法區別
Map集合允許value為null,並且沒有個數限制,所以當get()方法的返回值為null時,可能有兩種情況,一種是在集合中沒有該鍵物件,另一種是該鍵物件沒有對映任何值物件,即值物件為null。因此,在Map集合中不應該利用get()方法來判斷是否存在某個鍵,而應該利用containsKey()方
JAVA傳送http請求,呼叫http介面與方法
1.傳送POST請求,無引數名呼叫。 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import
Java 基礎資料型別 和 深度克隆物件的2種方法(實現Cloneable介面或者實現物件序列化)
知識點1(java有9種傳遞函式引數時是傳值): 8大基礎資料型別加String: 1,位元組 byte 2,短整型 short 3,整型int 4,長整形 long 5,字元型 char 6,浮點型 float 7,雙精度型 double 8,布林型 bo
PHP介面繼承及介面多繼承原理與實現方法詳解
在PHP的介面中,介面可以繼承介面。雖然PHP類只能繼承一個父類(單繼承),但是介面和類不同,介面可以實現多繼承,可以繼承一個或者多個介面。當然介面的繼承也是使用extends關鍵字,要多個繼承的話只要用逗號把繼承的介面隔開即可。 需要注意的是當你介面繼承其它介面時候,
Solaris 下圖形介面與字元介面的切換方法
直接進入圖形介面配置 /usr/dt/bin/dtconfig -d (disable auto-start) /usr/dt/bin/dtconfig -e (enable auto-start) 命令列轉入CDE圖形介面 #/usr/dt/bin/dtlogin
方法覆蓋與方法過載,介面與抽象類的區別
1:方法覆蓋(Overriding)和方法過載(Overloading)是什麼意思? 重寫和過載的區別? 答:Java中的方法過載發生在同一個類裡面兩個或者是多個方法的方法名相同但是引數不同的情況。與此相對,方法覆蓋是說子類重新定義了父類的方法。方法覆蓋必須有相同的方法名,
實現多個具有相同方法的介面和父類與實現介面有相同方法
一、實現多個具有相同方法的介面 這種情況還是比較少會遇到的,但事實是存在這樣的問題,所以寫下解決的方法: 使用內部類: interface InterA {void f();}interface I
Java中Cloneable介面的淺複製與深複製
深拷貝(深複製)和淺拷貝(淺複製)是兩個比較通用的概念,尤其在C++語言中,若不弄懂,則會在delete的時候出問題,但是我們在這幸好用的是Java。雖然java自動管理物件的回收,但對於深拷貝(深複製)和淺拷貝(淺複製),我們還是要給予足夠的重視,因為有時這兩個概念往往會給我們帶來不小的困惑。 淺拷貝是指拷
介面中的預設方法與靜態方法
在Java8之前的版本中,介面中只能宣告常量和抽象方法,介面的實現類中必須實現介面中所有的抽象方法。而在Java8中,介面中可以宣告預設方法和靜態方法。 介面中的預設方法 Java 8中允許介面中包含具有具體實現的方法,該方法稱為“預設方法”,預設方法使用“ default ”關鍵字修
Lua中的元表與元方法
類型 得到 算術 自己的 連接 還記得 clas 是否 操作符 前言Lua中每一個值都可具有元表。 元表是普通的Lua表,定義了原始值在某些特定操作下的行為。你可通過在值的原表中設置特定的字段來改變作用於該值的操作的某些行為特征。比如。當數字值作為加法的操作數時,Lua檢