java中的三種拷貝方式

java中的三種拷貝方式

第一種 基本數據類型:
	八大基本數據類型:
	int apples = 5;
	int pears = apples;

第二種 對象 淺拷貝:
	Student stu1 = new Student();
	stu1.setNumber(12345);
	Student stu2 = stu1;
	
	System.out.println("學生1:" + stu1.getNumber());	// 學生1:12345
	System.out.println("學生2:" + stu2.getNumber());	// 學生2:12345
	
	但是如果:
	stu2.setNumber(54321);
	System.out.println("學生1:" + stu1.getNumber());	// 學生1:54321
	System.out.println("學生2:" + stu2.getNumber());	// 學生2:54321
	因爲 stu1 和 stu2 指向內存堆中同一個對象
	解決方法:
		被複制的類需要實現Clonenable接口
		覆蓋clone()方法,訪問修飾符設爲public。方法中調用super.clone()方法得到需要的複製對象,(native爲本地方法)
	@Override
	public Object clone() {
		Student stu = null;
		try{
			stu = (Student)super.clone();
		}catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return stu;
	}
	Student stu1 = new Student();
	stu1.setNumber(12345);
	Student stu2 = (Student)stu1.clone();
	System.out.println("學生1:" + stu1.getNumber());	// 學生1:12345
	System.out.println("學生2:" + stu2.getNumber());	// 學生2:12345
	stu2.setNumber(54321);
	System.out.println("學生1:" + stu1.getNumber());	// 學生1:12345
	System.out.println("學生2:" + stu2.getNumber());	// 學生2:54321
	
	但是又如果:
	Address addr = new Address();
	addr.setAdd("杭州市");
	Student stu1 = new Student();
	stu1.setNumber(123);
	stu1.setAddr(addr);
	Student stu2 = (Student)stu1.clone();
	System.out.println("學生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());	// 學生1:123,地址:杭州市
	System.out.println("學生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());	// 學生2:123,地址:杭州市
	addr.setAdd("西湖區");
	System.out.println("學生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());	// 學生1:123,地址:西湖區
	System.out.println("學生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());	// 學生2:123,地址:西湖區
	原因是淺複製只是複製了addr變量的引用,將值複製後再將引用返回給新對象,並沒有真正的開闢另一塊空間。
	淺拷貝:BeanUtils.copyProperties(executiveSummary, executiveSummaryOld);

第二種 對象 深拷貝:
	將Address類可複製化
	然後在student類中:
	@Override
	public Object clone() {
		Student stu = null;
		try{
			stu = (Student)super.clone();	//淺複製
		}catch(CloneNotSupportedException e) {
			e.printStackTrace();
		}
		stu.addr = (Address)addr.clone();	//深度複製
		return stu;
	}
	// 學生1:123,地址:杭州市
	// 學生2:123,地址:杭州市
	// 學生1:123,地址:西湖區
	// 學生2:123,地址:杭州市
	或者序列化實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章