制作本地副本 2017年02月06日 82 阅读 制作本地副本2007-05-29 yycnet.yeah.net yyc译稍微总结一下:Java中的所有自变量或参数传递都是通过传递句柄进行的。也就是说,当我们传递“一个对象”时,实际传递的只是指向位于方法外部的那个对象的“一个句柄”。所以一旦要对那个句柄进行任何修改,便相当于修改外部对象。此外:■参数传递过程中会自动产生别名问题■不存在本地对象,只有本地句柄■句柄有自己的作用域,而对象没有■对象的&ldqu...
按值传递 2017年02月06日 82 阅读 按值传递2007-05-29 yycnet.yeah.net yyc译首先要解决术语的问题,最适合“按值传递”的看起来是自变量。“按值传递”以及它的含义取决于如何理解程序的运行方式。最常见的意思是获得要传递的任何东西的一个本地副本,但这里真正的问题是如何看待自己准备传递的东西。对于“按值传递”的含义,目前存在两种存在明显区别的见解:(1) Java按值传递任何东西。若将基本数据类型传递...
java克隆对象 2017年02月06日 84 阅读 java克隆对象2007-05-29 yycnet.yeah.net yyc译若需修改一个对象,同时不想改变调用者的对象,就要制作该对象的一个本地副本。这也是本地副本最常见的一种用途。若决定制作一个本地副本,只需简单地使用clone()方法即可。Clone是“克隆”的意思,即制作完全一模一样的副本。这个方法在基础类Object中定义成“protected”(受保护)模式。但在希望克隆的任何衍生类中,必须将其覆...
使类具有克隆能力 2017年02月06日 80 阅读 使类具有克隆能力2007-05-29 yycnet.yeah.net yyc译尽管克隆方法是在所有类最基本的Object中定义的,但克隆仍然不会在每个类里自动进行。这似乎有些不可思议,因为基础类方法在衍生类里是肯定能用的。但Java确实有点儿反其道而行之;如果想在一个类里使用克隆方法,唯一的办法就是专门添加一些代码,以便保证克隆的正常进行。1. 使用protected时的技巧为避免我们创建的每个类都默认具有克隆能力,clone()方法在基础类Object里...
java的clone实现 2017年02月06日 83 阅读 java的clone实现2007-05-29 yycnet.yeah.net yyc译理解了实现clone()方法背后的所有细节后,便可创建出能方便复制的类,以便提供了一个本地副本://: LocalCopy.java// Creating local copies with clone()import java.util.*;class MyObject implements Cloneable {int i;MyObject(int ii) { i =...
java Object.clone()的效果 2017年02月06日 81 阅读 java Object.clone()的效果2007-05-29 yycnet.yeah.net yyc译调用Object.clone()时,实际发生的是什么事情呢?当我们在自己的类里覆盖clone()时,什么东西对于super.clone()来说是最关键的呢?根类中的clone()方法负责建立正确的存储容量,并通过“按位复制”将二进制位从原始对象中复制到新对象的存储空间。也就是说,它并不只是预留存储空间以及复制一个对象&mdash...
克隆合成对象 2017年02月06日 82 阅读 克隆合成对象2007-05-29 yycnet.yeah.net yyc译试图深层复制合成对象时会遇到一个问题。必须假定成员对象中的clone()方法也能依次对自己的句柄进行深层复制,以此类推。这使我们的操作变得复杂。为了能正常实现深层复制,必须对所有类中的代码进行控制,或者至少全面掌握深层复制中需要涉及的类,确保它们自己的深层复制能正确进行。下面这个例子总结了面对一个合成对象进行深层复制时需要做哪些事情://: DeepCopy.java// Cloni...
用Vector进行深层复制 2017年02月06日 86 阅读 用Vector进行深层复制2007-05-29 yycnet.yeah.net yyc译下面让我们复习一下本章早些时候提出的Vector例子。这一次Int2类是可以克隆的,所以能对Vector进行深层复制://: AddingClone.java// You must go through a few gyrations to// add cloning to your own class.import java.util.*;class Int2 imp...
通过序列化进行深层复制(java) 2017年02月06日 79 阅读 通过序列化进行深层复制(java)2007-05-29 yycnet.yeah.net yyc译若研究一下第10章介绍的那个Java 1.1对象序列化示例,可能发现若在一个对象序列化以后再撤消对它的序列化,或者说进行装配,那么实际经历的正是一个“克隆”的过程。那么为什么不用序列化进行深层复制呢?下面这个例子通过计算执行时间对比了这两种方法://: Compete.javaimport java.io.*;class Thing1 i...
使克隆具有更大的深度 2017年02月06日 89 阅读 使克隆具有更大的深度2007-05-29 yycnet.yeah.net yyc译若新建一个类,它的基础类会默认为Object,并默认为不具备克隆能力(就象在下一节会看到的那样)。只要不明确地添加克隆能力,这种能力便不会自动产生。但我们可以在任何层添加它,然后便可从那个层开始向下具有克隆能力。如下所示://: HorrorFlick.java// You can insert Cloneability at any// level of inheritan...
为什么有这个奇怪的设计 2017年02月06日 85 阅读 为什么有这个奇怪的设计2007-05-29 yycnet.yeah.net yyc译之所以感觉这个方案的奇特,因为它事实上的确如此。也许大家会奇怪它为什么要象这样运行,而该方案背后的真正含义是什么呢?后面讲述的是一个未获证实的故事——大概是由于围绕Java的许多买卖使其成为一种设计优良的语言——但确实要花许多口舌才能讲清楚这背后发生的所有事情。最初,Java只是作为一种用于控制硬件的语言而设计,与因特网并没有...
java克隆的控制 2017年02月06日 79 阅读 java克隆的控制2007-05-29 yycnet.yeah.net yyc译为消除克隆能力,大家也许认为只需将clone()方法简单地设为private(私有)即可,但这样是行不通的,因为不能采用一个基础类方法,并使其在衍生类中更“私有”。所以事情并没有这么简单。此外,我们有必要控制一个对象是否能够克隆。对于我们设计的一个类,实际有许多种方案都是可以采取的:(1) 保持中立,不为克隆做任何事情。也就是说,尽管不可对我们的类克隆,...
副本构建器 2017年02月06日 80 阅读 副本构建器2007-05-29 yycnet.yeah.net yyc译克隆看起来要求进行非常复杂的设置,似乎还该有另一种替代方案。一个办法是制作特殊的构建器,令其负责复制一个对象。在C++中,这叫作“副本构建器”。刚开始的时候,这好象是一种非常显然的解决方案(如果你是C++程序员,这个方法就更显亲切)。下面是一个实际的例子://: CopyConstructor.java// A constructor for copying a...
java只读类 2017年02月06日 79 阅读 java只读类2007-05-29 yycnet.yeah.net yyc译尽管在一些特定的场合,由clone()产生的本地副本能够获得我们希望的结果,但程序员(方法的作者)不得不亲自禁止别名处理的副作用。假如想制作一个库,令其具有常规用途,但却不能担保它肯定能在正确的类中得以克隆,这时又该怎么办呢?更有可能的一种情况是,假如我们想让别名发挥积极的作用——禁止不必要的对象复制——但却不希望看到由此造成的副作用...
创建java只读类 2017年02月06日 86 阅读 创建java只读类2007-05-29 yycnet.yeah.net yyc译完全可以创建自己的只读类,下面是个简单的例子://: Immutable1.java// Objects that cannot be modified// are immune to aliasing.public class Immutable1 {private int data;public Immutable1(int initVal) {data = initVal...
“一成不变”的弊端(java) 2017年02月06日 85 阅读 “一成不变”的弊端(java)2007-05-29 yycnet.yeah.net yyc译从表面看,不变类的建立似乎是一个好方案。但是,一旦真的需要那种新类型的一个修改的对象,就必须辛苦地进行新对象的创建工作,同时还有可能涉及更频繁的垃圾收集。对有些类来说,这个问题并不是很大。但对其他类来说(比如String类),这一方案的代价显得太高了。为解决这个问题,我们可以创建一个“同志”类,并使其能够修改。以后只要涉及大量的修改工作,就可...
java不变字串 2017年02月06日 74 阅读 java不变字串2007-05-29 yycnet.yeah.net yyc译请观察下述代码://: Stringer.javapublic class Stringer {static String upcase(String s) {return s.toUpperCase();}public static void main(String[] args) {String q = new String("howdy");System...
java的String和StringBuffer类 2017年02月06日 85 阅读 java的String和StringBuffer类2007-05-29 yycnet.yeah.net yyc译这里总结一下同时适用于String和StringBuffer的方法,以便对它们相互间的沟通方式有一个印象。这些表格并未把每个单独的方法都包括进去,而是包含了与本次讨论有重要关系的方法。那些已被覆盖的方法用单独一行总结。首先总结String类的各种方法:方法 自变量,覆盖 用途构建器 已被覆盖:默认,String,StringBuffer,char...
java clone学习总结 2017年02月06日 94 阅读 java clone学习总结2007-05-29 yycnet.yeah.net yyc译由于Java中的所有东西都是句柄,而且由于每个对象都是在内存堆中创建的——只有不再需要的时候,才会当作垃圾收集掉,所以对象的操作方式发生了变化,特别是在传递和返回对象的时候。举个例子来说,在C和C++中,如果想在一个方法里初始化一些存储空间,可能需要请求用户将那片存储区域的地址传递进入方法。否则就必须考虑由谁负责清除那片区域。因此,这些方法的接...
java clone练习题 2017年02月06日 88 阅读 java clone练习题2007-05-29 yycnet.yeah.net yyc译(1) 创建一个myString类,在其中包含了一个String对象,以便用在构建器中用构建器的自变量对其进行初始化。添加一个toString()方法以及一个concatenate()方法,令其将一个String对象追加到我们的内部字串。在myString中实现clone()。创建两个static方法,每个都取得一个myString x句柄作为自己的自变量,并调用x.c...