android 浅复制和深复制-clone篇

有关java中的 浅复制和深复制

,这里不详细讨论。相关知识请参考以下帖子:

浅复制和深复制http://blog.csdn.net/yang_hui1986527/article/details/7029777
浅析Java中的深拷贝与浅拷贝http://blog.csdn.net/yang_hui1986527/article/details/7012428

android中的 浅复制和深复制,具体可能于java中的有一点不同。下面,我们来探讨下在这个问题。

主要思路:

1、创建TextBox,然后根据TextBox复制出一个对象TextBox2(点击屏幕,进行复制);

2、改变TextBox2的位置,方便观察比较差异。

3、改变TextBox2内部文本的位置。如果是浅复制,那么TextBox2内部文本改变位置的同时,TextBox内部文本的位置会随着改变。否则,如果是深度复制,TextBox内部文本的位置不会改变。

效果如下:

注:请注意文本“test”在文本框内的位置。

浅复制:

                                      

深复制:

  
                                        

源程序:

(点击下载:http://download.csdn.net/detail/yang_hui1986527/3874905)

CloneActivity.java

package com.clone;

import android.app.Activity;
import android.os.Bundle;

public class CloneActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        CloneView mCloneView = new CloneView(this);
        setContentView(mCloneView);
    }
}

CloneView.java

package com.clone;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class CloneView extends View {
	private Document mDocument = null;
	public Paint mPaint= null;
	public TextBox mTextBox = null;
	public TextBox mTextBox2 = null;

	public CloneView(Context context) {
		super(context);
		mDocument = new Document();
		mPaint = new Paint();
		initData();
	}

	public CloneView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mDocument = new Document();
		mPaint = new Paint();
		initData();
	}

	public CloneView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mDocument = new Document();
	}

	public void initData()
	{
		PointF textpos = new PointF(30,30);
		String text = new String("test");

		mTextBox = new TextBox(50, 50, 100, 100, textpos, text);

		mDocument.add(mTextBox);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		canvas.drawColor(Color.WHITE);
		mDocument.draw(canvas, mPaint);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
		{

			try {
				mTextBox2 = (TextBox)mTextBox.clone();
				mTextBox2.moveBound();
				mTextBox2.changeData();
			} catch (CloneNotSupportedException e) {
				e.printStackTrace();
			}
			if(mTextBox2 != null)
				mDocument.add(mTextBox2);
		}
		invalidate();
		break;
		case MotionEvent.ACTION_MOVE:
			break;
		case MotionEvent.ACTION_UP:
			break;
		default:
			break;
		}
		return super.onTouchEvent(event);
	}

}

Document.java

package com.clone;

import java.util.Vector;

import android.graphics.Canvas;
import android.graphics.Paint;

public class Document {

	private Vector<Object> objs = null;

	public Document() {
		objs = new Vector<Object>();
	}

	public void add(Object obj){
		objs.add(obj);
	}

	void draw(Canvas canvas, Paint paint) {
		canvas.save();

		for (int i = 0; i < objs.size(); i++) {
			Object obj = objs.get(i);
			obj.draw(canvas, paint);
		}

		canvas.restore();
	}

}

Object.java

package com.clone;

import android.graphics.Canvas;
import android.graphics.Paint;

public abstract class Object implements Cloneable{
	protected float posx = 0;
	protected float posy =0;
	protected float width = 0;
	protected float height = 0;

	public Object() {
		posx = 0;
		posy =0;
		width = 0;
		height = 0;
	}

	public Object(float posx,float posy,float width,float height){
		this.posx = posx;
		this.posy = posy;
		this.width = width;
		this.height = height;
	}

	public void moveBound() {
		this.posx += 100;
		this.posy += 100;
	}

	abstract  void draw(Canvas canvas,Paint paint);
	abstract  void changeData();

    public Object clone() throws CloneNotSupportedException {
        return (Object) super.clone();
    }
}

TextBox.java

package com.clone;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.PointF;

public class TextBox extends Object implements Cloneable{
	private PointF mtextpos = null;
	private String mtextString = null;

	public TextBox() {
		posx = 0;
		posy =0;
		width = 0;
		height = 0;
		mtextpos = new PointF();
		mtextString = new String();
	}

	public TextBox(float posx, float posy, float width, float height,PointF textpos,String text) {
		this.posx = posx;
		this.posy = posy;
		this.width = width;
		this.height = height;
		mtextpos = new PointF(textpos.x,textpos.y);
		mtextString = new String(text);
	}

	@Override
	void draw(Canvas canvas, Paint paint) {
		canvas.save();
		paint.setColor(Color.BLUE);
		paint.setStyle(Style.STROKE);
		canvas.drawRect(posx, posy, posx+width, posy+height, paint);

		canvas.translate(posx, posy);
		paint.setColor(Color.BLACK);
		paint.setTextSize(20);
		canvas.drawText(mtextString, mtextpos.x, mtextpos.y, paint);
		canvas.restore();

	}
//
//	//浅克隆
//    public TextBox clone() throws CloneNotSupportedException {
//        return (TextBox) super.clone();
//    }  

	//深克隆
    public TextBox clone() throws CloneNotSupportedException {
        TextBox o =  (TextBox) super.clone();  

         //对于string,int等基本类型,用上面一句就可以
        //对于复杂类型,例如PointF等还需要手动实现拷贝
        if(mtextpos != null)
        	o.mtextpos = new PointF(mtextpos.x,mtextpos.y);

        return o;
    }

	@Override
	void changeData() {
        if(mtextpos != null)
        	mtextpos.offset(20, 50);
	}
}
时间: 2024-11-03 03:53:45

android 浅复制和深复制-clone篇的相关文章

android 浅复制和深复制-Java Generic Deep Copy 篇

关于Java Generic Deep Copy 在java中的应用和注意事项,请参考:http://blog.csdn.net/yang_hui1986527/article/details/7039425 而关于在android程序中通过clone方法来进行浅复制和深复制,请参考:http://blog.csdn.net/yang_hui1986527/article/details/7036818 众所周知,android上层使用的是java语言,因此理论上于Java Generic De

深度解析javascript中的浅复制和深复制

     在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有 Number,Boolean,String,Null,Undefined,Object五种类型.而Object又包含Function,Array 和Object自身.前面的五种类型叫做基本类型,而Object是引用类型.可能有人就要问,为什么要分基本类型和引用类型呢?后面你就会明白的.      我们首先来看看浅复制和深复制的简洁定义: 深复制:直接将数据复制给对应的变量 浅复制:将数据的地

举例区分Python中的浅复制与深复制

  这篇文章主要介绍了举例区分Python中的浅复制与深复制,是Python入门学习中的重要知识,需要的朋友可以参考下 copy模块用于对象的拷贝操作.该模块非常简单,只提供了两个主要的方法: copy.copy 与 copy.deepcopy ,分别表示浅复制与深复制.什么是浅复制,什么是深复制,网上有一卡车一卡车的资料,这里不作详细介绍.复制操作只对复合对象有效.用简单的例子来分别介绍这两个方法. 浅复制只复制对象本身,没有复制该对象所引用的对象. ? 1 2 3 4 5 6 7 8 9 1

java中对象的浅复制和深复制笔记

在面向对象的语言中,如Java/Python,对象的复制有两种形式:浅复制和深复制 一.浅复制    浅复制只是将原对象的引用备份了一份给新的变量,实际两者指向的是同一个对象.在Python中,字典.列表.元祖等都是对象类型 >>> person=['name',['savings',100.00]] >>> hubby=person[:] >>> wifely=list(person) >>> [id(x) for x in per

php中浅复制与深复制的例子

周末闲来无事看到了原型模式,其中谈到了浅复制和深复制,想到PHP中的对应赋值.克隆以及克隆是浅复制还是深复制. 先来看看赋值,例如有一个简历类,有身高和体重两个属性: class Resume  {     public $height;     public $weight;       public $workExperience; } $ResumeA = new Resume(); $ResumeB = $ResumeA; 此时实例化了一个Resume类并赋值给了$ResumeA变量,然

浅析:对象的浅复制和深复制

问题描述 在面向对象的语言中,如Java/Python,对象的复制有两种形式:浅复制和深复制一.浅复制浅复制只是将原对象的引用备份了一份给新的变量,实际两者指向的是同一个对象.在Python中,字典.列表.元祖等都是对象类型>>> person=['name',]>>> hubby=person>>> wifely=list(person)>>> >>>person是一个列表对象,分割之后赋给hubby,将perso

java 浅复制和深复制

原文:http://ttitfly.iteye.com/blog/155422 1.java里的clone分为:  A:浅复制(浅克隆): 浅复制仅仅复制所考虑的对象,而不复制它所引用的对象.  b:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍.  Java中对象的克隆,为了获取对象的一份拷贝,我们可以利用Object类的clone()方法.必须要遵循下面三点  1.在派生类中覆盖基类的clone()方法,并声明为public[Object类中的clone()方法为protec

Java中对象的深复制和浅复制详解

1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用的对象都复制了一遍. 2.Java的clone()方法 ⑴clone方法将对象复制了一份并返回

Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍_java

深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复制)和浅拷贝(浅复制),我们还是要给予足够的重视,因为有时这两个概念往往会给我们带来不小的困惑. 浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象.深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象.举例来说更加清楚:对象A1中包含对B1的引用