复制对象时,使副本对象与svn 清理原始副本对象具有相互关联属性的复制方式的是( )

博客分类:
在开发中进行遇到值对象和实体间的数据复制.
其中最常用的为Apache BeanUtilsBean的copyProperties.
本次测试发现该工具可兼容大部分数据格式,但在Java.sql.Date和java.util.Date复制时,原数据如为空将发送报错.
通过注册BeanUtilsBean的转换器,简单封装copyProperties方法.
完成效果: 调用封装后的工具类方法复制对象属性时, 遇到Date数据一律给予新对象对应属性赋值为null.
测试代码如下
1.1 实体类Student
public class Student {
private int intV
private double doubleV
private long longValue0;
private boolean booleanValue0;
private Boolean booleanValue1;
private String strintV
private java.util.Date utilDateV
private java.sql.Date sqlDateV
private Integer IntegerV
private Long LongValue1;
//getter/setter
public int getIntValue() {
return intV
public void setIntValue(int intValue) {
this.intValue = intV
public double getDoubleValue() {
return doubleV
public void setDoubleValue(double doubleValue) {
this.doubleValue = doubleV
public String getStrintValue() {
return strintV
public void setStrintValue(String strintValue) {
this.strintValue = strintV
public java.util.Date getUtilDateValue() {
return utilDateV
public void setUtilDateValue(java.util.Date utilDateValue) {
this.utilDateValue = utilDateV
public java.sql.Date getSqlDateValue() {
return sqlDateV
public void setSqlDateValue(java.sql.Date sqlDateValue) {
this.sqlDateValue = sqlDateV
public Integer getIntegerValue() {
return IntegerV
public void setIntegerValue(Integer integerValue) {
IntegerValue = integerV
public long getLongValue0() {
return longValue0;
public void setLongValue0(long longValue0) {
this.longValue0 = longValue0;
public Long getLongValue1() {
return LongValue1;
public void setLongValue1(Long longValue1) {
LongValue1 = longValue1;
public boolean isBooleanValue0() {
return booleanValue0;
public void setBooleanValue0(boolean booleanValue0) {
this.booleanValue0 = booleanValue0;
public Boolean getBooleanValue1() {
return booleanValue1;
public void setBooleanValue1(Boolean booleanValue1) {
this.booleanValue1 = booleanValue1;
public Teacher getTeacher() {
public void setTeacher(Teacher teacher) {
this.teacher =
1.2 实体类teacher
public class Teacher {
//getter/setter
public int getId() {
public void setId(int id) {
public String getName() {
public void setName(String name) {
this.name =
2 简单封装的工具类BeanUtilPlus1
package com.test.
import java.lang.reflect.InvocationTargetE
import java.util.HashM
import java.util.M
import org.apache.commons.beanutils.BeanU
import org.apache.commons.beanutils.ConvertU
import org.apache.commons.beanutils.converters.DateC
import org.apache.commons.beanutils.converters.SqlDateC
import org.apache.commons.logging.L
import org.apache.commons.logging.LogF
* 继承apache的BeanUtils,避免调用copyProperties时因date为空而报错的情况
public class BeanUtilPlus1 extends BeanUtils {
private static Map cache = new HashMap();
private static Log logger = LogFactory.getFactory().getInstance(
BeanUtilPlus1.class);
private BeanUtilPlus1() {
//注册sql.date的转换器,即允许BeanUtils.copyProperties时的源目标的sql类型的值允许为空
ConvertUtils.register(new SqlDateConverter(null),
java.sql.Date.class);
//ConvertUtils.register(new SqlTimestampConverter(), java.sql.Timestamp.class);
//注册util.date的转换器,即允许BeanUtils.copyProperties时的源目标的util类型的值允许为空
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
public static void copyProperties(Object target, Object source)
throws InvocationTargetException, IllegalAccessException {
//支持对日期copy
org.apache.commons.beanutils.BeanUtils.copyProperties(target, source);
3 测试类testClient
使用反射机制打印出对象的属性值
import java.lang.reflect.InvocationTargetE
import java.lang.reflect.M
import com.test.util.BeanUtilPlus1;
public class testClient {
* 测试BeanUtilsBean.getInstance().copyProperties对数据进行赋值时候的效果
* java.sql.Date不可为空值
* java.util.Date不可为空值
* 使用改进的BeanUtilPlus1.copyProperties
* Date为空时,直接赋空值.
public static void main(String[] args) {
* 初始化数据
Teacher t1=new Teacher();
t1.setId(1);
t1.setName("teacher t1");
Student s1=new Student();
s1.setBooleanValue0(true);
s1.setBooleanValue1(true);
s1.setDoubleValue(1.1);
s1.setIntegerValue(12);
s1.setIntValue(123);
s1.setLongValue0(12L);
s1.setLongValue1(2L);
s1.setSqlDateValue(new java.sql.Date(new java.util.Date().getTime()));
s1.setUtilDateValue(new java.util.Date());
s1.setStrintValue("student s1");
s1.setTeacher(t1);
//打印出所有内容
Class c = Class.forName("Student");
Object o = c.newInstance();
Object o=s1;
Method[] ms= c.getMethods();
System.out.println(ms.length);
System.out.println("原始数据");
for(Method m:ms){
if( m.getName().contains("get")){
System.out.println("method
"+m.getName()+"
System.out.println(m.invoke(o));
} catch (Exception e) {
e.printStackTrace();
Student s2=new Student();
BeanUtilsBean.getInstance().copyProperties(s2, s1);
//调用copy方法
BeanUtilPlus1.copyProperties(s2,s1); //调用改写过的copy方法
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
Class c = Class.forName("Student");
Object o=s2;
Method[] ms= c.getMethods();
System.out.println("新数据");
for(Method m:ms){
if( m.getName().contains("get")){
System.out.println("method
"+m.getName()+"
System.out.println(m.invoke(o));
} catch (Exception e) {
e.printStackTrace();
浏览: 5026 次
来自: 上海
1 public static Singleton getIn ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'摘要:掌握对象的复制可以提高我们的作图效率,而复制对象的属性又是一种比较特殊、重要的复制方法,它可以方便而快捷地将指定对象中的轮廓笔、轮廓色、填充、和文本属性通过复制的方法应用到所选对象中
一、对象的复制:
在CorelDRAW中关于对象的复制方法是多种的,以下七种方法教您如何在 CorelDRAW X7中复制对象:
1、在编辑菜单下复制:执行“编辑”——“复制”命令后,在执行“编辑”——“粘贴”命令。即可将对象粘贴到原位置。
2、在移动的过程中复制对象:用鼠标右键拖拽对象到合适位置,释放鼠标,在弹出的快捷菜单中选择复制命令。
3、最常用的快捷键复制:使用“选择工具”选择对象后,按组合键传ctrl+c将对象复制,在按组合键ctrl+V将对象粘贴到文件中。
4使用快捷键Ctrl+D键复制:选中需要复制的对象,按快捷键Ctrl+D,会按你预设的位置复制。
5、使用工具栏中的复制功能:单击标准工具栏中的复制按钮,在单击“粘贴”按钮。
6、小键盘的复制功能:按下小键盘上的“+”键,即可在原位置快速的复制出一个新对象。(注意:必须是小键盘上的“+”才可以,所以笔记本上这个操作是失效的。)
7、利用鼠标左右键复制:使用“选择工具选择对象后”,按下鼠标左键将对象拖动到适当的位置,在释放鼠标做几件之前按下鼠标右键,即可将对象在当前位置复制一个副本对象。
二、对象的再制:
对象的再制(Ctrl+D),是指快捷的将对象按一定的方式复制为多个对象。
执行编辑——再制命令,或者按组合键Ctrl+D,复制第一次就调整好间距和角度。再次操作时它是按上一步复制对象的间距和角度复制出一个副本,该命令使用一次只能复制一个副本,连续执行三次“再制”命令,效果如图所示:
在空白区域单击,取消对象的选择状态,在属性栏上修改“再制距离”X和Y的数值(设置原始对象和在职对象之间的距离)。设置完成以后,按组合键ctrl+D,将以新的再制距离复制对象。
三、复制对象属性:
复制对象的属性可以将对象的所有属性复制,对象属性的复制具体操作方法如下:
使用选择工具选择对象,执行编辑——复制属性命令,弹出复制属性对话框,选择需要复制的对象属性选项“轮廓笔”、“轮廓色”、“填充”
单击“确定”按钮,当光标变成黑色箭头状态后,即可将对象的属性按设置复制到所选择的对象上,如图所示:
原文链接:
本文仅代表作者观点,不代表百度立场。本文系作者授权百度百家发表,未经许可,不得转载。
分享到微信朋友圈
打开微信,点击 “ 发现 ”
使用 “ 扫一扫 ” 即可将网页分享至朋友圈。
扫一扫在手机阅读、分享本文
百家号作者平台APP
扫码下载安卓客户端
便捷管理文章信息
随时查看文章收益OmniGraffle 6.3 for Mac User Manual - 工具栏和使用工具
如您所见,工具栏中包含控制项。从用于向版面添加新图层(或添加全新版面)的按钮到用于绘图并将对象连接在一起所需的工具,工具栏中一切应有尽有。
工具栏的左右两侧分别是用于隐藏和显示左右侧边栏的控制项。左侧为版面和内容侧边栏,右侧为检查器侧边栏(其中还包括模板库)。除此之外,还有用于关闭、隐藏以及让 OmniGraffle 切换到全屏模式的标准 OS X 窗口控制项。
顶部工具栏的中心有一个文稿图标,您可能认为它只能显示文件类型,没有其他作用。但是,如果按住命令键 (?) 并点按该图标,则会出现一个关联菜单,显示出该文件在 Mac 上的存储位置。如果您正在使用复制的文件且不记得上一个修订版的保存位置,此功能便非常有用。该图标旁显示有文件名,如果 OmniGraffle 文件具有多个版面,文件名将附加一个冒号 (:),冒号后是当前所使用版面的名称。
文稿图标和文件名下方是用于交互和控制版面上对象行为的按钮。可将对象翻转到背面或调到前面,将其锁定在原位(此功能极为方便),也可将对象分组和取消分组。
但是,接下来才是最重要的工具:和。
选择工具(箭头)
用于选择版面上的对象。
用于绘制正方形、矩形和圆形等形状。
用于绘制版面上对象之间的线条。
用于为线条输入文本标签或在版面上添加随机文本块。
用于创建自定形状。
OmniGraffle 6 包含高级展开-收缩技术。好的,它实际上是笔工具后面的一个按钮,但您可以用它将工具调板收缩为一组核心工具,或点按 Expando! 以获取更多工具的访问权限。收缩可节省宝贵的工具栏空间来容纳其他按钮,展开则可显示全部内容。
您可以在绘图工具预置中移动分隔线,以更改调板处于收缩状态时的可用工具,也可以完全移去“展开-收缩”按钮。
用于在版面上快速创建新对象。
用于复制对象的样式(包括形状、笔划、文本样式等),从而可将样式“刷”在其他对象上。
用于快速复制粘贴版面上的对象。要在橡胶戳记处于永久工具模式时选择其他对象,请按住 Option 键,然后点按版面上的另一个对象。
用于重置将线条连接至对象的磁化物。
用于放大版面。当缩放工具处于永久工具模式时,请按住 Option 键并点按版面进行缩小。
用于来回拖移版面。
动作浏览工具
如果在属性检查器中设置了动作,则用于与对象进行交互。
注意动作浏览工具在 OmniGraffle 标准版和专业版中都可用,但您只能在 OmniGraffle 专业版中向对象分配动作。
请参阅了解有关 OmniGraffle 工具的深入信息。
然而,如果双击某个工具,那么在切换到其他工具之前,该工具将始终处于激活状态。工具按钮的背景将变为深灰色,表示该工具是永久工具。
您可以在绘图工具预置中更改此行为,使得工具始终(或永不)处于永久激活状态。
同样,也可通过按数字键来激活工具。从 1 到 0 的每个键都对应调板中从左到右的工具。唯一的例外是“手动”和“动作浏览”工具未分配数字,而是改用空格键和 b 键来分别访问这两个工具。按两次数字键可永久激活某个工具。
您可以在绘图工具预置中配置每个工具的热键。
要自定工具栏,请在工具栏上选择显示 & 自定工具栏,或按住 Control 键点按工具栏并选择自定工具栏。执行此操作时,工具栏下方将下滑出一张表单,其中显示许多可向上拖移至工具栏的功能相关按钮。例如,如果您购买了 OmniGraffle 6 专业版,则可将制作表格或开始演示文稿按钮添加至工具栏。
如果您不喜欢所做的更改,或者想要将工具栏重置为预设状态,只需将底端的行向上拖动至工具栏即可。完成对工具栏的更改后,请点按完成。
位于菜单最顶部的项是当前样式,即您设置的最近使用的样式。可能显示的其他部分包括:
版面样式,取决于在工具调板中选择的工具,显示版面上所有内容的对象类型的相关样式。例如,如果在“工具调板”中选择了“线条”工具,“版面样式”部分会针对您在版面上绘制的所有线条显示不同样式。
使用某一个版面样式 - 首先在“工具调板”中选择一项工具,然后点按“样式格”并在“版面样式”部分中选择一个可用样式。现在,您选择的样式便成为了该绘图工具的预设样式。
OmniGraffle 专业版还提供喜爱的样式,这是您希望在多个项目中重复使用的样式的个性化列表。
要创建“喜爱的样式”,请按住 Control 键点按版面上的对象,然后从关联菜单中选择添加至喜爱的形状样式。要从“喜爱的样式”列表中移去样式,请选择版面上的任意对象,点按工具栏中的“样式格”图标,然后按住 Control 键点按想要移去的样式并在关联菜单中选择从喜爱的样式中移去。
在版面上选中了某个对象后,检查器侧边栏将自动切换至对象检查器。您可以在此使用检查器来更改所选对象的所有设置。
要同时选择不同对象,请点按版面的空白区域,然后将选择框拖到对象上。如果按住 Option 键,则只会选择完全位于矩形内部的对象。还可以按住 Command 或按住 Shift 键点按对象,以将其添加到选择或从选择中移除。
要选择群组、表格或子图中的项目,请先点按一次来选择整个群组,然后再次点按以选择其中的项目。版面的其余部分会变暗以显示您处于群组编辑模式中。点按群组外部的任意位置来退出群组编辑模式。
如果使用带有触控式触控板的 Mac,则可以采用两根手指的旋转手势来旋转所选对象(确保多点触摸手势在 OmniGraffle ? 预置 ? 通用 ? 多点触摸中启用)。
要非常精确地移动所选对象,请按方向键。按住 Option 或 Shift 来进行较大规模的移动。
在启用了智能参考线(排列 ? 参考线 ? 智能对齐方式参考线和智能距离参考线)的情况下,可在版面上整齐地排列对象并保持精确的间距。开始拖移后,按住 Command 键可暂时启用或停用智能参考线。
要拖移对象副本而非对象本身时,请在拖移时按住 Option 键。
要更改形状的大小,使用选择工具点按并拖动其中一个大小调整控制项。在点按并拖动其中一个句柄时,对象将由相反的句柄进行固定,并且对象将以移动鼠标的方向调整大小。
与大小调整句柄进行交互时,下列按键可提供更多功能:
调整大小以保持原始对象的高宽比时,应按住 Shift 键。
调整中心点固定的对象的大小时,应按住 Option 键。
调整大小以保持高宽比和根据中心点调整对象大小时,应按住 Shift-Option 键。
按住 Command 并将大小调整控制项更改为旋转控制项,即可旋转对象。
如果版面上存在不同大小的对象,但希望将它们调整为同样大小,首先选择一个尺寸将作为其他对象标准的对象,选择排列 ? 大小,然后选择其中一个大小调整选项。
如果您选择了表格,边缘句柄就会看起来像小网格一样。您可以拖移它们来更改表格中的行数或栏数。拖移角部句柄,即可按常规方式调整表格大小。
注意如果已启用智能参考线,当您拖移对象时会出现智能参考线,帮助您均匀地调整对象尺寸。开始拖移后,按住 Command 键可暂时启用或停用智能参考线。
使用线条工具创建的任何线条都有两个点:来源位置上的红点以及目标位置上的绿点。线条也可能穿过任意数量的蓝色中间点。拖移其中一个点来移动线条;通过拖移来源点或目标点,即可使线条连接到其他对象或断开与其他对象的连接。
自定形状(使用笔工具创建)和贝塞尔类型线条在每个顶点处都有控制点。点按控制点以进行选择;如果控制点隐藏在选择句柄之后,请按住 Option-Command 键点按以进行选择,或先选择不同控制点来隐藏句柄。如果控制点有贝塞尔句柄,您选择点时会出现以下情况:
拖移其中一个句柄可同时调整它们,按住 Option 键并拖移可一次只调整一个。
按住 Shift 键并拖移将句柄角度的增量控制为 45 度。
按住 Command 键来拖移点以显示其句柄。
如果将句柄拖移到非常接近点本身,句柄将完全消失。
将点添加到现有线条的预设方式为连按该线条,但可在通用预置(OmniGraffle ? 预置 ? 通用)中进行更改。
要将点添加到自定形状,请沿着形状的笔划连按某处。
要从线条或自定形状中删除某点,选择该点,然后按删除键或从菜单条中选择编辑 ? 删除。
要创建形状:
拖移版面直到得到您满意的尺寸。
拖移时按住 Shift 键可创建等高等宽的形状(如正方形、正圆形等)。
创建好形状之后,可选择该形状并使用“对象”、“类型”和“属性”检查器来更改其属性。
要创建新线条:
点按您想要的线条来源;它可以是一个对象(线条将一直随附其上),也可以是版面上的一个空点(线条开始部位断开)。
依照您的喜好点按版面上的任意多个空点,以给出线条的中间点。
您可以点按对象(线条将一直随附其上)以在对象上终止线条,也可以连按版面上的空点以在空点上终止线条;此方式可在“绘图工具预置”(OmniGraffle ? 预置 ? 绘图工具 ? 线条编辑)中更改。
要想在画线时将线条从一个点连接到另一个点之间转角的增量限制为 45 度,请同时按住 Shift 键。要想在画线时防止连接到对象,请同时按住 Option 键。
当两个对象由一条线连接时,来源点对象被视为目标点对象的父项。这种方法用于定义大纲视图中的对象关系,以及使用自动布局时的对象关系。
线条可以附上线条标签。使用文字工具点按线条以创建新的文字标签。或者,将现有文本块拖移到线条,直到该线条高亮显示,然后放开,将其作为标签附在线条上。
点按某个形状以开始编辑其文字。处于文字编辑模式下时,顶部的标尺会变成文字标尺,您可使用标准 OS X 文字编辑命令(例如,您可以使用方向键来四处移动插入点)。
点按或拖移版面空白区域,可创建设置特别适合包含文字的新形状。单次点按可创建水平扩展以符合您输入文字的对象;拖移则会创建具有指定宽度的对象。请记住,通过这种方式创建的对象与其他形状并无根本差别,只是它们会以文字检查器中的某些特定设置开始,因而可以更方便地包含文字。
点按连线以将新标签加入其中。此标签就像您点按版面的空白区域时所创建的对象一样,所不同的是其依附方式是作为线条标签。
如果您需要查找包含特定词语的 OmniGraffle 图表,就可以使用 OS X 的 Spotlight 搜寻功能来查找对象内部的文字。
要开始创建一个新形状,请点按版面上的任何位置。每个接续的点按都会为形状添加新的点,直到您连按或按下 Return 键来创建最后一个点为止。在整个过程的任何步骤中,采用点按并拖移而不是仅仅点按,便可建立带有贝塞尔句柄的点。在创建形状时,您可以按下 Delete 键来移去最后添加的点。
只要将鼠标移到形状之上,就可以使用贝塞尔句柄来定义任何形状。每个点都有一个面向下一个点的句柄,以及一个面向上一个点的句柄。两点间的线条是由第一个点面向前的句柄和第二个点面向后的句柄所定义。如果没有任何句柄,您将获得一条相当直的线条。如果有句柄,则句柄间的线条就是一条尝试在句柄长度和方向间折衷的曲线。如果您不亲自尝试一下,就无法领会其中的奥妙。现在就动手试试吧!
创建好形状之后,可使用选择工具选择该形状并编辑它的点、调整现有句柄、将句柄添加到不含句柄的点,或使用“对象”、“类型”和“属性”检查器更改形状的属性。
如果未选择任何内容,请点按版面上的任意空点在此处创建新的普通形状,并将其选中。选择了形状之后,尝试进行一些组合:
点按版面上的任意空点以创建连接到原始形状的新形状。
现在改为按住 Option 键以创建兄弟项(与所选形状连接到相同的父项)。
按住 Shift 键以添加父级项(本质上是翻转新对象的连线)。
按住 Command 键以创建完全断开的形状。
如果版面上已存在对象,则首先使用选择工具将其选中,这样便可将其作为创建更多连接形状的起点,然后按住 d 键切换到图表工具。
只要将鼠标移到修改键上,只需点按几次即可创建十分复杂的图表。
该工具的弹出菜单包含可吸取样式的列表;选择您喜欢的样式,样式刷将只吸取或应用这些样式。例如,如果您只选择“填充”,就可以在不影响对象其他样式的情况下,将特定的填充样式应用到对象。
从样式刷工具弹出菜单选择清除内容即可重置样式刷的内容,之后您可吸取新的样式。也可按住 Option 键并点按不同的对象来替换样式刷的内容。
如果按住 Shift 键,橡胶戳记工具将沿着原始对象或先前所粘贴副本的中心线(垂直或水平)对齐将要粘贴的对象。
从工具的弹出菜单中选择清除内容即可重置戳记的内容,之后便可抓取新的对象。也可按住 Option 键并点按不同的对象来替换戳记的内容。
磁化物是形状上的特殊点,可以吸引连线。如果形状上没有磁化物,则预设情况下,所有线条都将连接到形状的中心。如果存在至少一个磁化物,则每条已连接的线都将被吸引到最近的磁化物。您也可以将线条直接连接到磁化物,以确保无论如何移动形状它们都保持连接到同一磁化物。
可查看连接检查器 (Command–3) 中显示的磁化物。然而,如果要将磁化物放置在形状上的特定位置,则点按磁化物工具,然后点按对象上的任意位置。
要更改对象上的磁化物位置,点按现有磁化物并将其拖移到其他位置。如果对象具有多个磁化物,则会出现智能参考线,这样您也可以对齐磁化物。要删除磁化物,按住 Shift 键或按住 Option 键并点按磁化物。
点按并将方框拖移过版面来指定您要缩放的矩形;阴影显示了松开鼠标按钮时窗口中可见的区域。
如果按住 Option 键并拖移,则矩形会以您开始拖动的点为中心。当您需要对版面上某个单个元素聚焦时,这尤其有用。
拖移时,按住 Shift 键可四处移动缩放选择区域,而不是调整其大小。
按住 Shift 键点按工具调板中的缩放工具以返回 100% 缩放比例,即实际大小。
您可以一直使用底部栏右下方的缩放菜单来缩放至特定的百分比,它就在版面下方。
如果您的 Mac 具有可多点触摸的触控板,则可以通过该触控板使用收拢手势来更改缩放级别。要启用多点触摸,请转到 OmniGraffle ? 预置 ? 通用 ? 多点触摸并打开启用多点触摸触控板手势。现在,手指张开即可放大,手指收合即可缩小。多点触摸缩放使得在版面的对象上进行放大和缩小更为容易。
在版面上进行放大以及想要移动到不同位置时,主要使用手动工具。为此,使用手动工具的快速访问键空格键将鼠标指针切换为手形,然后点按并四处拖移版面。
在拖移时,张开的手将变为握住的拳头,表明您正在版面上进行抓取。
此处的秘诀是使用动作属性检查器(Command–3,仅在 OmniGraffle 专业版中可用)将动作分配到对象。
首先在版面上创建并选择对象,然后切换到动作属性检查器。预设情况下,对象不执行任何动作,这意味着它只是放置在版面的合适位置上。可绑定至对象的其他动作包括:
打开 URL - 用于分配要打开的 URL;点按时,将在用户的预设 Web 浏览器中打开页面。
打开文件 — 用于分配要打开的文件;点按时,文件将根据该文件类型的预置在预设应用程序中打开。您也可以选择在 OmniPresence 文件夹中打开同步文件。
运行脚本 - 在点按对象时运行 AppleScript。
跳到别处 - 用于跳到 OmniGraffle 项目中的其他版面、高亮显示其他对象或在版面上进行放大或缩小。
显示或隐藏图层 - 用于在项目中显示或隐藏特定图层。
分配到对象的动作使创建高度交互的演示变得更加容易,甚至使为正在设计的 killer iOS 应用程序创建 UI/UX 模型变得更加容易。
有关详细信息,请参阅。
注意虽然仅 OmniGraffle 专业版提供动作检查器,但 OmniGraffle 标准用户仍可使用动作浏览工具与通过 OmniGraffle 专业版创建的文件进行交互。先说一下深拷贝和浅拷贝通俗理解
深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个
浅拷贝:赋值时,引用赋值,相当于取了一个别名。对其中一个修改,会影响另一个
PHP中, = 赋值时,普通对象是深拷贝,但对对象来说,是浅拷贝。也就是说,对象的赋值是引用赋值。(对象作为参数传递时,也是引用传递,无论函数定义时参数前面是否有&符号)
php4中,对象的 = 赋值是实现一份副本,这样存在很多问题,在不知不觉中我们可能会拷贝很多份副本。
php5中,对象的 = 赋值和传递都是引用。要想实现拷贝副本,php提供了clone函数实现。
clone完全copy了一份副本。但是clone时,我们可能不希望copy源对象的所有内容,那我们可以利用__clone来操作。
在__clone()中,我们可以进行一些操作。注意,这些操作,也就是__clone函数是作用于拷贝的副本对象上的
//普通对象赋值,深拷贝,完全值复制
echo $m;//值复制,对新对象的改变不会对m作出改变,输出 1.深拷贝
echo PHP_EOL;
/*==================*/
//对象赋值,浅拷贝,引用赋值
class Test{
public $a=1;
$m = new Test();
$n = $m;//引用赋值
$m-&a = 2;//修改m,n也随之改变
echo $n-&a;//输出2,浅拷贝
echo PHP_EOL;
  由于对象的赋值时引用,要想实现值复制,php提供了clone函数来实现复制对象。
但是clone函数存在这么一个问题,克隆对象时,原对象的普通属性能值复制,但是源对象的对象属性赋值时还是引用赋值,浅拷贝。
class Test{
public $a=1;
class TestOne{
public $b=1;
//包含了一个对象属性,clone时,它会是浅拷贝
public function __construct(){
$this-&obj = new Test();
$m = new TestOne();
$n = $m;//这是完全的浅拷贝,无论普通属性还是对象属性
$p = clone $m;
//普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
$p-&b = 2;
echo $m-&b;//输出原来的1
echo PHP_EOL;
//对象属性是浅拷贝,改变对象属性中的a,源对象m中的对象属性中a也改变
$p-&obj-&a = 3;
echo $m-&obj-&a;//输出3,随新对象改变
  要想实现对象真正的深拷贝,有下面两种方法:
写clone函数:如下
class Test{
public $a=1;
class TestOne{
public $b=1;
//包含了一个对象属性,clone时,它会是浅拷贝
public function __construct(){
$this-&obj = new Test();
//方法一:重写clone函数
public function __clone(){
$this-&obj = clone $this-&
$m = new TestOne();
$n = clone $m;
$n-&b = 2;
echo $m-&b;//输出原来的1
echo PHP_EOL;
//可以看到,普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
//由于改写了clone函数,现在对象属性也实现了真正的深拷贝,对新对象的改变,不会影响源对象
$n-&obj-&a = 3;
echo $m-&obj-&a;//输出1,不随新对象改变,还是保持了原来的属性
  改写__clone()函数不太方便,而且你得在每个类中把这个类里面的对象属性都在__clone()中 一一 clone
第二种方法,利用序列化反序列化实现,这种方法实现对象的深拷贝简单,不需要修改类
class Test{
public $a=1;
class TestOne{
public $b=1;
//包含了一个对象属性,clone时,它会是浅拷贝
public function __construct(){
$this-&obj = new Test();
$m = new TestOne();
//方法二,序列化反序列化实现对象深拷贝
$n = serialize($m);
$n = unserialize($n);
$n-&b = 2;
echo $m-&b;//输出原来的1
echo PHP_EOL;
//可以看到,普通属性实现了深拷贝,改变普通属性b,不会对源对象有影响
$n-&obj-&a = 3;
echo $m-&obj-&a;//输出1,不随新对象改变,还是保持了原来的属性,可以看到,序列化和反序列化可以实现对象的深拷贝
 还有第三种方法,其实和第二种类似,json_encode之后再json_decode,实现赋值 
阅读(...) 评论()}

我要回帖

更多关于 统计对象的原始资料 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信