1. 程式人生 > >Java 基礎資料型別 和 深度克隆物件的2種方法(實現Cloneable介面或者實現物件序列化)

Java 基礎資料型別 和 深度克隆物件的2種方法(實現Cloneable介面或者實現物件序列化)

知識點1(java有9種傳遞函式引數時是傳值):

8大基礎資料型別加String:

1,位元組 byte  

2,短整型 short 

3,整型int 

4,長整形 long 

5,字元型 char 

6,浮點型 float 

7,雙精度型 double 

8,布林型 boolean

9,String

這8大基礎型別+String是傳值。

知識點2(深度克隆物件的三個方法):

方法1.

import java.util.ArrayList;

/**
 * 1.必須實現Cloneable介面.
 * 2.寫clone方法的話,在clone中程式碼上每一處都要實現深複製.
 * @author jianan
 */
class Work implements Cloneable{
	private String strText;
	private ArrayList<String> array = new ArrayList<String>();
	
	@SuppressWarnings("unchecked")
	@Override
	protected Work clone(){
		Work work;
		try {
			work = (Work)super.clone();
			 work.strText = this.strText;
			 work.array = (ArrayList<String>) (this.array.clone()); //深克隆
			return work;
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public void addImage(String imgName){
		array.add(imgName);
	}
	
	public void setText(String strText){
		this.strText = strText;
	}
	
	public void display(String str){
		System.out.println(str);
		System.out.println("Text:" + strText);
		for(int i = 0; i < array.size(); i++){
			System.out.println("Image:" + array.get(i));
		}
		
		System.out.println();
	}
}

//測試函式
public class Main {

	public static void main(String[] args) {
		Work work = new Work();
		work.setText("111");
		work.addImage("1.png");
		work.addImage("2.png");
		work.addImage("3.png");
		work.display("111");
		
		Work work2 = work.clone();   
		work2.setText("2");
		work2.addImage("4.png");
		work2.addImage("5.png");
		work2.addImage("6.png");
		work2.display("222");
		
		work.display("111");
	}
}
方法2.
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
/**
 * 1.實現Serializable介面即可.toString方法不用重寫因為該接口裡面本身就為空.
 * @author jianan
 */
//深克隆 工具
class DepthCloneUtil{
	public static Object depthClone(Object srcObj){
		Object cloneObj = null;
		try {
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			ObjectOutputStream oo = new ObjectOutputStream(out);
			oo.writeObject(srcObj);
			ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
			ObjectInputStream oi = new ObjectInputStream(in);
			cloneObj = oi.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		}		
		return cloneObj; 
	}
}

//
class Work implements Serializable{
	private static final long serialVersionUID = -3219618174845671783L;  //會自動補充的
	private String strText;
	private ArrayList<String> array = new ArrayList<String>();
	
	public void addImage(String imgName){
		array.add(imgName);
	}
	
	public void setText(String strText){
		this.strText = strText;
	}
	
	public void display(String str){
		System.out.println(str);
		System.out.println("Text:" + strText);
		for(int i = 0; i < array.size(); i++){
			System.out.println("Image:" + array.get(i));
		}
		
		System.out.println();
	}
}

//測試函式
public class Main {

	public static void main(String[] args) {
		Work work = new Work();
		work.setText("111");
		work.addImage("1.png");
		work.addImage("2.png");
		work.addImage("3.png");
		work.display("111");
		
		Work work2 = (Work)DepthCloneUtil.depthClone(work); //如果採用物件序列化的話,
		work2.setText("2");
		work2.addImage("4.png");
		work2.addImage("5.png");
		work2.addImage("6.png");
		work2.display("222");
		
		work.display("111");
	}
}

方法3

直接寫一個clone方法。

2種方式都實現了深度克隆,輸出結果都是:

/*
111
Text:111
Image:1.png
Image:2.png
Image:3.png

222
Text:2
Image:1.png
Image:2.png
Image:3.png
Image:4.png
Image:5.png
Image:6.png

111
Text:111
Image:1.png
Image:2.png
Image:3.png
*/


相關推薦

Java 基礎資料型別 深度克隆物件2方法(實現Cloneable介面或者實現物件序列)

知識點1(java有9種傳遞函式引數時是傳值): 8大基礎資料型別加String: 1,位元組 byte   2,短整型 short  3,整型int  4,長整形 long  5,字元型 char  6,浮點型 float  7,雙精度型 double  8,布林型 bo

1.java 基本資料型別、運算子、控制語句、方法遞迴

1.基本資料型別   Java是一種強型別語言,每個變數都必須宣告其資料型別。 Java的資料型別可分為兩大類:基本資料型別(primitive data type)和引用資料型別(reference data type)。 Java中定義了3類8種基本資料型別 (1)整

python學習第三天:python基礎基礎資料型別變數)

註釋 以  # 開頭的語句是註釋,如,註釋不會被編譯執行; 格式 當語句以冒號:結尾時,縮排的語句視為程式碼塊。按照約定俗成的管理,應該始終堅持使用4個空格的縮排(在文字編輯器中,需要設定把Tab自動轉換為4個空格,確保不混用Tab和空格)。 如,而其中這張圖中紅框框裡的是程式碼塊

Java資料型別 自動裝箱拆箱機制

Java的資料型別 和裝箱拆箱機制 資料型別 第一類整數型(byte short int long) Java各整數型有固定的表示範圍和欄位長度 ,不會受到不同作業系統的影響,這點確保了java程式的可移植性。 Java中整數型的資料預設值為int. 表示方式 十進位制:123 八

Django基礎-資料型別引數表

資料型別表 模組類名稱用途釋義模組類名稱用途釋義 Field欄位主類CharField(Field)字串 IntegerField(Field)整型FloatField(IntegerField)浮點數 DecimalField(IntegerField)小數BaseTemporalField(Fie

java基本資料型別引用型別以及他們的儲存方式

1、基本資料型別: byte 8位 short 16 位 int 32 位 long 64位 float 32位 double 64位 2、基本資料型別和引用資料型別的儲存位置: java中的基本資料型別是儲存在棧中還是儲存在堆中取決於基本型別

Dart2基礎-資料型別變數

目錄 資料型別 變數 常量 資料型別 整型(int) 整型是不超過64位,不同的平臺位數不一樣。如果是DartVM, 整型的範圍是2^63-1到-2^63。如果需要編譯成js程式碼,那麼整型的範圍就是2^53-1到-2^53。 // 整型10進位制 int

二、JAVA資料型別運算子

1、註釋 (1)單行註釋:與C/C++相同 (2)多行註釋:同上 (3)文件註釋: 1)什麼是文件註釋? 將我們寫的一些類和方法,提取出來形成一份API文件,告訴其他人這個類或者方法的作用以及使用方法,類似VS下的幫助文件。 2)如何寫文件註釋? 文件註釋以斜線後面緊跟兩個星號開始(/*

java基本資料型別引用資料型別及其存放地址(棧堆)

1.基本資料型別:     boolean,char,byte,short,int,long,float,double                                     

[Java基礎] 資料型別

2.1 常量和資料型別 資料型別四類八種 四類 八種 位元組數 資料表示範圍 整型 byte 1 -128~127 整型 short 2 -32768~32767 整形 int

Java基礎資料結構演算法

學習程式設計的第一天,就被告知程式=資料結構+ 演算法。作為一名開發者,雖然平時單獨研究資料結構和演算法的情況不多,但也一直在用。這些基礎知識和思想伴隨著自己寫的每一句程式碼。 資料結構 Array陣列 和C/C++以及其他語言一樣,Java中的陣列有

Java基礎——基本型別包裝類、基本型別字串之間的轉換

基本型別和包裝類之間的轉換 基本型別和包裝類之間經常需要互相轉換,以 Integer 為例(其他幾個包裝類的操作雷同哦): 在 JDK1.5 引入自動裝箱和拆箱的機制後,包裝類和基本型別之間的轉換就更加輕鬆便利了。 那什麼是裝箱和拆箱呢?我們分別來看下 裝箱:把基本型別轉換成包裝類,使其具有物件的

python基礎-資料型別變數

整數、浮點數、字串、布林值、空值、常量 整數和浮點數 1)整數運算永遠是精確的,浮點數可能會四捨五入 2)字串:以單引號或雙引號括起來任意文字 3)布林值:False和True  布林值可以用and、or和not運算 4)空值是Python裡一個特殊的值,用None

java 判斷資料型別方法

1.如果你得到是一個Object物件,可以用if(obj instanceof String)來判斷是否是String物件,int是基本型別不可以這麼判斷,只能用它的包裝類Integer,同樣用instanceof 2.如果set方法只能接受一個引數,而且必須有int的話,可以寫多個set方法,如set(S

Java基本資料型別引用資料型別作為實參傳遞時對形參影響

一,基本資料型別8種,byte,short,long,int         char,boolean,double,float二,引用資料型別3種,類介面基本資料型別作為實參傳遞形參時候,對形參的值改

java基礎_String型別char型別、自動型別提升強制型別轉換

String:字串型別,用””『雙引號表示』 Char:字元型別,用’’『單引號表示』,裡面只能有一個字元或者沒有,表示空字元。在記憶體中佔據兩個位元組,也就是2Byte,也就是16位(16bit)

從頭學Java — 基本資料型別String

1.基本資料型別 在Java中由8種基本資料型別,四個整數型別(byte,short,int,long),兩個小數型別(float,double),一個字元型(char),一個布林型別(boolean) 型別 位元組 取值範圍 b

Java 基本資料型別包裝類的區別

首先要明白棧記憶體和堆記憶體的區別,具體的值,比如int i = 5,這個值是放在棧記憶體中,Integer i = new Integer();這個i物件是放在堆記憶體中,而i(引用變數)是在棧記憶體中 。 以long為例 long是基本資料型別

java基本資料型別陣列

第一類:邏輯型boolean 第二類:文字型char 第三類:整數型(byte、short、int、long) char型別佔2個位元組 short從-32768到32767 int從-2147483648,到2147483647共10位 long從-9223372036854775808到92233

二叉樹的高度 java 利用遞迴層次遍歷兩方法

原文:http://blog.csdn.net/fangchao3652/article/details/53456468 ackage edu.lnu.fang.BiTree; import java.util.ArrayList; import java.util.L