Article View: cn.bbs.comp.lang.java
Article #22080Java���˼��---��12�� ���ݺͷ��ض���
From: �˺�2��
Date: Tue, 28 Oct 2003 01:47
Date: Tue, 28 Oct 2003 01:47
515 lines
61505 bytes
61505 bytes
��ĿǰΪֹ������Ӧ�Զ���ġ����ݡ�����һ����Ϊ��̵���ʶ����סʵ�ʴ��ݵ�ֻ��
һ�����
����������������У����ǿ������Եġ���ͨ����ʽ�������ݶ����Ҵ����ʱ��
�������������⡣����Щʱ��ȴ���ò���ȡһЩ�dz�������ʹ�����ͻȻ���������
��������C++�����DZ�÷dz����ӣ���Java����⣬����ʮ���б�Ҫȷ��ʶ�ڶ���
�ݺ�ֵʱ�����һ�С������DZ��µ���ּ��
�������Ǵ�ijЩ����ij�����ƻ�����ת�ƹ����ģ���ôһ�㶼���ʵ�����Java��ָ��
�𣿡���Щ����Ϊָ��IJ��������ѣ�����ʮ��Σ�գ�����һ����Ը����Ϊ��û�кô�
��ͬʱ����Java����˺õĿڱ�������Ӧ�ú���������Լ���ǰ����е��鷳������
�����ܼд���ָ������ġ�Σ��Ʒ����Ȼ��ȷ��˵�� Java����ָ��ģ���ʵ�ϣ�Jav
a��ÿ�����������������⣩�ı�ʶ������ָ���һ�֡������ǵ�ʹ���ܵ���
�ϸ�����ƺͷ����������������������С����ġ���������ϵͳҲ�����⡣��������
һ���Ƕ�˵��Java��ָ�룬��û�д�ͳָ����鷳������һ�Ƚ�����ָ����������
���������������� ����ȫָ�롱����Ԥ��ѧУΪѧ���ṩ�İ�ȫ�������ơ������
�ر����⣬���������Լ���ֻ������ʱҪ��������Ҫϰ��һЩ���ƵĹ�����
12.1 ���ݾ��
�����ݽ���һ������ʱ��ָ�����Ȼ����ͬ�Ķ���һ����ʵ�����֤����һ
�㣨��ִ���������ʱ���鷳����ο���3��3.1.2С�ڡ���ֵ������
542ҳ����
toString�������ڴ�ӡ������Զ����ã���PassHandlesֱ�Ӵ�Object�̳У�û��toStr
ing�����¶��塣��ˣ��������� toString��Object�汾����ӡ��������࣬������
�Ǹ��������ڵ�λ�ã����Ǿ����Ƕ����ʵ�ʴ洢λ�ã������������£�
p inside main(): PassHandles@1653748
h inside f() : PassHandles@1653748
���Կ���������p����h���õĶ���ͬһ��������ȸ���һ���µ�PassHandles������Ч
���ˣ�ʹ�����ܽ�һ�������һ����������������Ҳ��������һ����Ҫ�����⡣
12.1.1 ��������
��������ζ�Ŷ�������ͼָ��ͬһ��������ǰ�������չʾ������������
���Ǹ�������д��һ��ʲô�������ͻ����������⡣��������������߲�ϣ���Ǹ�
����ı䣬���¾�Ҫʧ���ˡ�������������������˵����
543ҳ����
����������
Alias1 y = x; // Assign the handle
����½�һ��Alias1������ǰ���������new������һ�����ʶ����Ƿ����һ
�����еľ�����Ծ��x�����ݡ���������xָ��ĵ�ַ�����������y����������x��
��y������ͬ�Ķ�����������������һ����һ��x��i�������������ֵ��
x.i++;
y��iֵҲ��Ȼ�ܵ�Ӱ�졣�����յ�����Ϳ��Կ�����
544ҳ�ϳ���
��ʱ��ֱ�ӵ�һ������취���Ǹɴ����������Ҫ���⽫������ָ��ͬһ��������
�ڵ�ͬһ��������������ʹ����������͵��ԡ�Ȼ��һ�����������Ϊһ����
���������ݡ�������Java��������������������ͻ��Զ����֣���Ϊ������
���ؾ������ġ��ⲿ�����ڷ���������֮�ⴴ���Ķ���������һ�����ӣ�
544ҳ����
������£�
x: 7
Calling f(x)
x: 8
�����ı����Լ��IJ����ⲿ����һ��������������������ж����Ƿ���?�û�
�Ƿ�Ը�������Լ��Dz��ǻ�������⡣
ͨ�������ǵ���һ��������Ϊ�˲����ֵ����������ı�Ϊ����÷������Ǹ������
״̬��������ʵ�����������Ǹ�����һ����Ϣ���ķ�ʽ����������Ҫ����һ������
��������IJ�����������÷����ġ������á���Side Effect����������������һ����
���Լ�����ķ������������û���ȷ��ָ����һ�����������ʹ���Ǹ��������ܻ���
�ĺ���Լ����DZ����в�����ڴ�����Щ�����ȱ�ݣ�����Ӧ�þ�������ı����
������һ�����������ڼ���һ�������Ҳ��������ⲿ�����Ӧ���Լ��ķ�����
������һ���������Ӷ��Ǹ������µĴ�������ݶ���Χ���������չ���ġ�
12.2 �������ظ���
���ܽ�һ�£�Java�е������Ա��������ݶ���ͨ��ݾ����еġ�Ҳ����˵��
�����Ǵ��ݡ�һ������ʱ��ʵ�ʴ��ݵ�ֻ��ָ��λ�ڷ����ⲿ���Ǹ�����ġ�һ����
������һ��Ҫ���Ǹ��������κ��ģ����൱�����ⲿ�����⣺
������ݹ���л��Զ������������
�������ڱ��ض���ֻ�б��ؾ��
��������Լ������������û��
������ġ�����ʱ�䡱��Java�ﲻ�Ǹ�����
��û�������ϵ�֧�֣��糣�����ɷ�ֹ�����ģ��Ա������ĸ����ã�
��ֻ�ǴӶ����ж�ȡ��Ϣ��������ݾ������Ա�������������Ч��һ����ʽ
���������dz�ǡ����Ĭ�ϵķ���һ��Ҳ������Ч�ķ�����Ȼ����ʱ���轫��������
���صġ��Դ�ʹ���������ĸı�ֻӰ��һ�����ظ��������������Ķ������Ӱ�졣
������������Զ�֧���ڷ������Զ�����ⲿ�����һ�����ظ�����ע�͢٣�������
Java���߱��������������������Ǵﵽͬ���Ч��
�٣���C�����У�ͨ�����Ƶ����������λ��Ĭ�ϲ����ǰ�ֵ���ݡ�C++Ҳ����������һ
��ʽ������ֵ���ݶ��ǿ϶���һ����Ч�ķ�ʽ�����⣬��C++������֧�ְ�ֵ���ݵ�
����Ҳ���ѱ�д���Ǽ�����ͷʹ�����顣
12.2.1 ��ֵ����
����Ҫ�����������⣬���ʺϡ���ֵ���ݡ��Ŀ��������Ա���������ֵ���ݡ��Լ���
�ĺ���ȡ�����������������з�ʽ��������˼�ǻ��Ҫ���ݵ��κζ�����һ��
���ظ������������������������ο����Լ������ݵĶ��������ڡ���ֵ���ݡ��ĺ�
�壬Ŀǰ�������ִ����������ļ�⣺
(1) Java��ֵ�����κζ�����������������ʹ��ݽ���һ������������ȷ�õ�����
�����͵�һ��������������һ�����ݽ��뷽�����õ����Ǿ��ĸ���������������
Ϊ��һ�С�����ֵ���ݡ���Ȼ������˵��Ҳ��һ��ǰ����϶�Ҳ�ᱻ���ݡ���Java
����Ʒ����ƺ���Щ��ǰ���������Ǻ��ԣ������ʱ���Լ��������һ�����Ҳ��
��˵�����������ǽ�������ɡ�������Ϊ�ڷ�����������ʱ��ϵͳ���Զ��չ���
��IJ��졣
(2) Java��Ҫ��ֵ���ݣ����Ա�������������ȴ�ǰ����ô��ݵġ��õ�������۵�ǰ��
�Ǿ��ֻ�Ƕ����һ�����������Բ����Ǵ��ݾ������⣬����ֱ��ָ�� ������
���ݶ������ڽ��䴫�ݽ���һ������ʱû�л�ö����һ�����ظ��������Զ�����
Ȼ���ǰ�ֵ���ݵġ�Sun��˾�ƺ���ij�̶ֳ���֧����һ��⣬��Ϊ������δʵ�֡�
�Ĺؼ���֮һ����byvalue����ֵ������û��֪���Ǹ��ؼ���ʲôʱ����Է������á�
���ܴ������ֲ�ͬ�ļ�⣬�����ķ�����������ڶԡ����IJ�ͬ������ɵ�
���Ҵ����ڱ���ʣ�µIJ�����ر�������⡣��Ҳ��þͻ�֪�����������������ȥ��
ʵ��û������ġ�������Ҫ�������һ�����Ĵ��ݻ�ʹ�����ߵĶ���������ĸı�
��
12.2.2 ��¡����
������һ������ͬʱ����ı�����ߵĶ���Ҫ�����ö����һ�����ظ�������
Ҳ�DZ��ظ�������һ����;������������һ�����ظ�����ֻ���ʹ�� clone()
�������ɡ�Clone�ǡ���¡������˼����������ȫһģһ��ĸ�������������ڻ���O
bject�ж���ɡ�protected�����ܱ�����ģʽ������ϣ���¡���κ��������У����뽫
�串��Ϊ��public��ģʽ�����磬������Vector������clone()��������ΪVector����
clone()��������ʾ��
547ҳ����
clone()����������һ��Object�����߱���������������Ϊ��ȷ���͡��������ָ��Vec
tor��clone()���������Զ����Կ�¡ Vector�ڰ��ÿ���������ڱ������⣬�ϵ�
Vector�Ϳ�¡��Vector��������ͬ�Ķ�������ͨ��������������������ơ���
�ߡ�dz�㸴�ơ�����Ϊ��ֻ������һ������ġ����桱���֡�ʵ�ʶ������������
�桱���⣬���������ָ������ж����Լ���Щ������ָ����������ж����ɴ���
�ơ�����ǡ�����������ϵ������������ܸ���������������������ȫ
�渴�ơ����ߡ���㸴�ơ���
������пɿ���dz�㸴�ƵĽ��ע���v2��ȡ���ж�Ҳ��Ӱ�쵽v��
548ҳ�ϳ���
һ����˵�����ڲ��ұ�֤Vector���Ķ����ǡ����Կ�¡����ע�͢ڣ��ģ��������
��Ҫ��ͼ��¡��Щ����
�ڣ������Կ�¡����Ӣ�イ��cloneable��������Java����ר�ű����������һ���ؼ���
��
12.2.3 ʹ����п�¡����
���ܿ�¡������������������Object�ж���ģ�����¡��Ȼ������ÿ�������Զ���
�С����ƺ���Щ����˼�飬��Ϊ����������������ǿ϶����õġ���Javaȷʵ�е�
���������֮���������һ������ʹ�ÿ�¡������Ψһ�İ취����ר�����һЩ����
���Ա㱣֤��¡������С�
1. ʹ��protectedʱ�ļ���
Ϊ�������Ǵ�����ÿ���Ĭ�Ͼ��п�¡������clone()�����ڻ���Object��õ��ˡ�
����������Ϊprotected����������ɵĺ����ǣ�����Щ��ʹ��һ�������Ŀͻ�
����Ա��˵�����Dz���Ĭ�ϵ�ӵ�������������Σ����Dz�������ָ������һ����
��������clone()��������������ijЩ������ر����ã������ö����Եķ�ʽ��¡һϵ��
�����ڱ����ڵ�ʱ����ʵ����֪ͨ���Ƕ��ɿ�¡��һ�ַ�ʽ�������������
���ǣ�Java���еĴ��������ܿ�¡����ˣ���������ִ���������룺
Integer x = new Integer(l);
x = x.clone();
��ô�ڱ����ڣ�����һ������Ĵ�����Ϣ�������������Dz��ɷ���clone()������ΪInt
eger��û�и�����������protected�汾��˵��Ĭ�ϵģ���
���ǣ�������������һ����Object������������У�������Ǵ�Object����ģ�����
��Ȩ����Object.clone()����Ϊ���� ��protected��������������һ���̳����С���
��clone()�ṩ��һ�����õĹ��ܡ�������е��Ƕ���������������λ�����ƣ���
���൱�ڱ��Ŀ�¡�ж���Ȼ�����������Ҫ���Լ��Ŀ�¡������Ϊpublic��������
�����ʡ���֮����¡ʱҪע��������ؼ������ǣ������϶�Ҫ���� super.clone()����
��ע�⽫��¡��Ϊpublic��
��ʱ�����ڸ������������и���clone()�������ֱ��ʹ�����ǵ�clone()�������ѳ�
Ϊpublic�������Dz���һ����������ϣ��ģ�Ȼ������Object.clone()��������ʵ��
�����һ������������Ҳ�п������������������protected�ļ���������ֻ����һ�Σ�
�״δ�һ�����߱���¡��������̳У�������ʹһ�����ɡ��ܹ���¡�������ڴ�����
����̳е��κγ��ϣ�clone()�������ǿ���ʹ�õģ���ΪJava������������֮����
С�����ķ��ʷ�Χ������֮��һ�������ÿ��Կ�¡������������κζ��������ܹ���
¡�ģ����ʹ������Ļ��ƣ��������ۣ����䡰�رա���¡������
2. ʵ��Cloneable�ӿ�
Ϊʹһ������Ŀ�¡��������Բ����Ҫ����һ�����飺ʵ��Cloneable�ӿڡ������
��ʹ���Ծ���֣���Ϊ���ǿյģ�
interface Cloneable {}
֮����Ҫʵ������սӿڣ���Ȼ������Ϊ�������������ͳ�һ��Cloneable���Լ�����
���ij����������Щ����Ϊ������ʹ�ýӿ�����һ�֡���ƭ����Ϊ����Ϊ��ʹ�õ�����
����DZ�����⣬���ԭ������˼��Cloneable interface��ʵ�ְ�����һ����ǵĽ�ɫ
����װ����������С�
�������ԭ��ٳ���Cloneable interface�Ĵ��ڡ����ȣ�������һ���������;��ָ��
һ�������ͣ����Ҳ�֪�����Ƿ�����ܿ�¡�Ǹ���������������£�����instance
of�ؼ��֣���11���н��ܣ��������Ƿ�ȷʵͬһ���ܿ�¡�Ķ������ӣ�
if(myHandle instanceof Cloneable) // ...
�ڶ���ԭ���ǿ��ǵ����ǿ��ܲ�Ը���ж������Ͷ��ܿ�¡������Object.clone()����֤
һ�����Ƿ������ʵ����Cloneable�ӿڡ������Ƿģ���������һ��CloneNotS
upportedExceptionΥ��������һ������£����DZ��뽫��implement Cloneable����
Ϊ�Կ�¡�����ṩ֧�ֵ�һ���֡�
12.2.4 �ɹ��Ŀ�¡
�����ʵ��clone()�������������ϸ�ں�ɴ������ܷ��㸴�Ƶ��࣬�Ա��ṩ��һ
�����ظ�����
550-551ҳ����
��������clone()�����ܹ����ʣ����Ա��뽫����Ϊpublic�������ģ�����Σ���Ϊc
lone()�ij����ж���Ӧ����clone()�Ļ���汾��������õ�clone()��Object�ڲ�Ԥ
�ȶ���õġ�֮�����ܵ����������������protected���ܵ������ģ����ԣ���������
�����������ʡ�
Object.clone()����ԭ�ȵĶ����ж����Ϊ�¶����ڳ��㹻����ڴ棬�����ж���
��λ��ԭ���Ķ����Ƶ��¶������������λ���ơ������Ұ�һ����뷨���������
Ӧ������clone()���������ġ�����Object.clone()��ʽ��ʼ����ǰ�����Ȼ���һ����
�Ƿ�Cloneable�����Ƿ���п�¡������������֮�����Ƿ�ʵ����Cloneable�ӿڡ���δ
ʵ�֣�Object.clone()������һ�� CloneNotSupportedExceptionΥ��ָ�����Dz��ܿ�
¡����ˣ����������һ��try-catch�齫��super.clone ()�ĵ��ô����Χ�����װ
����������ͼ����һ��Ӧ���������ֵ�Υ����Ϊ����ȷʵ��ʵ����Cloneable�ӿڣ���
��LocalCopy�У���������g()��f()��ʾ�����ֲ���ݷ�����IJ��졣���У�g()��ʾ
���ǰ����ô��ݣ�������ⲿ�������ض��Ǹ��ⲿ�����һ�����á���f()�Ƕ���
�������п�¡�����Խ���������������ԭ���Ķ��ֶ�����������������ϣ��
�����顣�����ܷ���ָ������¶����һ�������Ҳ����ԭ���Ķ�������κθ���
�á�ע���������������Щ�Źֵ���䣺
v = (MyObject)v.clone();
����������Ǵ���һ�����ظ�����Ϊ���ⱻ�����һ����������ס�����൱���
�ı�����ʽ��Java������ȫ����ģ���Ϊ��һ�����ֵ����ж���ʵ�ʶ���һ�������
�Ծ��v���ڿ�¡һ������ָ��ĸ������������շ���ָ�������Object��һ�����
��Ϊ����Object.clone()����������ģ��������뽫������Ϊ��ȷ�����͡�
��main()�У����ֲ�ͬ����ݷ�ʽ������������Ƿֱ������һ����ͬ�ķ��������
������£�
552ҳ����
���Ҫ��ס����һ����ʵ��Java�ԡ��Ƿ�ȼۡ��IJ��Բ�������Ƚ϶�����ڲ����м�
�飬�Ӷ��ʵ���ǵ�ֵ�Ƿ���ͬ��==��!=�����ֻ�ǼضԱȾ������ݡ��������
�ĵ�ַ��ͬ������Ϊ���ָ��ͬ��Ķ���������Ϊ�����ǡ��ȼۡ��ġ������������
������ǡ����ڱ������⣬����Ƿ�ָ��ͬһ������
12.2.5 Object.clone()����
����Object.clone()ʱ��ʵ�ʷ������ʲô�����أ����������Լ������︲��clone()ʱ
��ʲô��������super.clone()��˵����ؼ���أ������е�clone()������������ȷ
�Ĵ洢��������ͨ��λ���ơ���������λ��ԭʼ�����и��Ƶ��¶���Ĵ洢�ռ䡣
Ҳ����˵����ֻ��Ԥ���洢�ռ��Լ�����һ������ʵ����Ҫ���������֮��
���ȷ��С��Ȼ�����Ǹ���������������Щ�����������ɸ��ඨ��֮clone()����
���ڲ������н��еģ����ಢ��֪��Ҫ���Լ�����̳г�ȥʲô�������Դ�һ����Ѿ�
�µ�����������Ҫ��RTTI�ж����¡�Ķ����ʵ�ʴ�С����ȡ���ַ�ʽ�� clone()��
����ɽ�������ȷ�����Ĵ洢�ռ䣬�����Ǹ����ͽ�����ȷ�İ�λ���ơ�
��������Ҫ��ʲô����¡��̵ĵ�һ������ͨ����Ӧ���ǵ���super.clone()��ͨ�����
һ��ȷ�ĸ��ƣ���������Ϊ����Ŀ�¡��̽�����һ�����õĻ���ɲ�ȡ��
һЩ��Ҫ�IJ�������������յĿ�¡��
Ϊȷ���˽����������ʲô������Ҫ��ȷ���Object.clone()Ϊ���Ǵ�����ʲô���ر�
�أ�����Զ���¡���о��ָ���Ŀ��������������ӿ����������ʽ�ļ�⣺
553-554ҳ����
һ��Snake���ߣ�����ι��ɣ�ÿһ�ε����Ͷ���Snake�����ԣ�����һ��һ�ζ�������
�����б?���жζ�����ѭ����ʽ�����ģ�ÿ����һ�Σ�����ʹ��һ�������������ֵ
�ݼ���ֱ������Ϊ�㡣��Ϊ��ÿ�θ���һ����һ���ı�ǣ��ڶ�������һ��Char��
��ֵ��ÿ��ѭ������������ʱ���������
increment()������������ѭ������ÿ����ǣ�ʹ�����ܿ�������ı仯����toString��
ѭ����ӡ��ÿ����ǡ�������£�
554ҳ�г���
����ζ��ֻ�е�һ�β�����Object.clone()���Ƶģ����Դ�ʱ���е���һ�֡�dz�㸴��
������ϣ���������ߡ��������С���㸴�ơ����������ڱ����ǵ�clone()���ȡ����
�IJ�����
ͨ�����ڴ�һ���ܿ�¡���������super.clone()����ȷ�����л����ж�������Objec
t.clone()���ܹ����С�������Ϊ������ÿ�������ȷ����һ��clone()��������Щ��
��������ԭʼ����ľ�������ĵ���Ҳ������ͬ�������ȹ�����࣬Ȼ����
��һ������Ĺ����������Դ����ƣ�ֱ��λ�����������������������clone()��
���Ǹ�������������û�а취ʵ���Զ���¡��Ϊ�˿�¡���������Լ���ȷ���С�
12.2.6 ��¡�ϳɶ���
��ͼ��㸴�ƺϳɶ���ʱ������һ�����⡣����ٶ���Ա�����е�clone()����Ҳ������
���Լ��ľ�������㸴�ƣ��Դ����ơ���ʹ���ǵIJ�����ø��ӡ�Ϊ������ʵ����
�㸴�ƣ�������������еĴ�����п��ƣ���������ȫ��������㸴������Ҫ�漰����
��ȷ�������Լ�����㸴������ȷ���С�
������������ܽ������һ���ϳɶ��������㸴��ʱ��Ҫ����Щ���飺
555-556ҳ����
DepthReading��TemperatureReading�dz����ƣ����Ƕ�ֻ���˻�������͡�����cl
one()�����ܹ��dz�������super.clone()�����ؽ��ɡ�ע��������ʹ�õ�clon
e()��������ȫһ�µġ�
OceanReading����DepthReading��TemperatureReading����ϲ���ɵġ�Ϊ�˶������
��㸴�ƣ�clone()����ͬʱ��¡OceanReading�ڵľ��Ϊ�ﵽ���Ŀ�꣬super.clo
ne()�Ľ��������ͳ�һ��OceanReading�����Ա���� depth��temperature���
12.2.7 ��Vector������㸴��
���������Ǹ�ϰһ�±�����Щʱ�������Vector���ӡ���һ��Int2���ǿ��Կ�¡�ģ���
���ܶ�Vector������㸴�ƣ�
557-558ҳ����
Int3��Int2�̳ж������������һ���µĻ����ͳ�Աint j�����Ҳ����Ϊ�Լ���Ҫ��
�θ���clone()����ȷ��j�õ����ƣ���ʵ�鲢����ˡ���Int2��clone()����Int3��clo
ne()����ʱ��������Object.clone()���жϳ���ǰ��������Int3��������Int3�ڵ���
�ж�����λ��ֻҪû��������Ҫ��¡�ľ��� Object.clone()��һ�����þ��������
�б�Ҫ�ĸ��ơ�������clone()���ڲ�νṹ�����һ������ġ�
���ˣ���ҿ����ܽ����Vector������㸴�Ƶ��Ⱦ��������ڿ�¡��Vector������
���б�����¡��Vectorָ���ÿ������Ϊ�˶�Hashtable��ɢ�б?������㸴��
��Ҳ�����ȡ���ƵĴ��?
�������ʣ��IJ�����ʾ����¡��ʵ�ʽ��С���֤�ݾ����ڿ�¡�˶����Ժ�������
�ı����ԭ���Ǹ��������κ�Ӱ�졣
12.2.8 ͨ�����л�������㸴��
���о�һ�µ�10�½��ܵ��Ǹ�Java 1.1�������л�ʾ����ܷ�������һ���������л�
�Ժ��ٳ����������л�������˵����װ�䣬��ôʵ�ʾ��������һ������¡���Ĺ��
��
��ôΪʲô�������л�������㸴���أ������������ͨ�����ִ��ʱ��Ա���������
������
559-560ҳ����
���У�Thing2��Thing4���˳�Ա����������Ҫ����һЩ��㸴�ơ�һ����Ȥ�ĵط�
�Ǿ���Serializable����������ã����ڸ�������ʱȴҪ����ö�Ĺ�������¡�漰��
�����������ù�������ʵ�ʵĶ��������൱�ġ����ܺõ�˵����һ�С�������
�������зֱ�õ��Ľ��
��ȷ
561ҳ�ϳ���
�������л��Ϳ�¡֮����ʱ��������⣬����Ҳע����л����������н��
�ȶ������¡ÿһ�λ��ѵ�ʱ�䶼����ͬ�ġ�
12.2.9 ʹ��¡���и������
���½�һ���࣬��Ļ����Ĭ��ΪObject����Ĭ��Ϊ���߱���¡��������������һ��
�ῴ��������ֻҪ����ȷ����ӿ�¡���������������㲻���Զ��������ǿ���
���κβ������Ȼ���ɴ��Ǹ��㿪ʼ���¾��п�¡������������ʾ��
561-562ҳ����
��ӿ�¡����֮ǰ������������ֹ���ǵĿ�¡���ԡ�һ����Scientist������˿�¡����
����ôScientist�Լ�������С����ᡱ�����Կ�¡��
12.2.10 Ϊʲô�������ֵ����
֮���Ըо�������������أ���Ϊ����ʵ�ϵ�ȷ��ˡ�Ҳ���һ������ΪʲôҪ����
�����У���÷����������������ʲô�أ����潲������һ��δ��֤ʵ�Ĺ��¡�����
��������Χ��Java���������ʹ���Ϊһ��������������ԡ�����ȷʵҪ���������
�ܽ�����ⱳ������������顣
�����Javaֻ����Ϊһ�����ڿ���Ӳ�������Զ���ƣ���������û��˿����ϵ������
��һ��������ڵ�����һ�����������ڳ���Ա���Զ�����һ��������п�¡������һ
����clone()�ͷ����ڸ���Object���棬����Ϊ����һ�ֹ��÷�ʽ���������ͨ���ܹ���
����һ��������п�¡���������������ķ�ʽ�ˣ��Ͼ��������κκ�����
��Java��������һ���ռ����������������Ե�ʱ�����ȴ�����˱仯��ͻȻ�أ�
��������˰�ȫ���⣬��������Ȼ����Щ������ʹ�ö����йأ����Dz�Ը���κ��˿�
¡�Լ��ı��ܶ������������������Ϊԭ���Ǹ���ֱ�۵ķ�����ӵĴ�����
����clone()��Object�ﱻ���ó� ��protected�������뽫�串�ǣ���ʹ�á�implement
Cloneable����ͬʱ���Υ������⡣
ֻ����������Object��clone()����ʱ����û�б�Ҫʹ��Cloneable�ӿڣ���Ϊ�Ǹ���
�����������ڼ�õ���飬��ȷ�����ǵ���ʵ���� Cloneable����Ϊ�˱��������ԣ���
������Cloneable������ζ��ǿյģ�����û������Լ�ʵ��Cloneable��
12.3 ��¡�Ŀ���
Ϊ����¡���������Ҳ����Ϊֻ�轫clone()��������Ϊprivate��˽�У����ɣ�
���������в�ͨ�ģ���Ϊ���ܲ���һ�����������ʹ�����������и�˽�С�����
�����鲢û����ô�����⣬�����б�Ҫ����һ�������Ƿ��ܹ���¡�������������
��һ���࣬ʵ��������ַ������ǿ��Բ�ȡ�ģ�
(1) ������������Ϊ��¡���κ����顣Ҳ����˵�����ܲ��ɶ����ǵ����¡���������
�е�һ����ȴ�ɸ��ʵ�����������¡��ֻ��Object.clone()Ҫ�����е��ֶν���ijЩ
����IJ���ʱ���ſ������ⷽ��ľ�����
(2) ֧��clone()������ʵ��Cloneable���ɿ�¡�������ı�������������clone()����
�����ǵ�clone()�У��ɵ���super.clone()������������Υ�������ʹclone()������
�����κ�Υ��
(3) ��������֧�ֿ�¡�������������������ľ�����Щ����Ҳ���ܹ���¡������
����������һ�����ӣ����Ϳ����ſ�¡ӵ�жԷ��������ж���������� ��������
��Υ��ֻ������ЩΥ��ͨ��ɡ��ٸ�������˵��������һ�������Vector������ͼ
��¡�Լ����ɵ����ж���д�����һ��Vectorʱ������֪���ͻ�����Ա���ʲô��
ʽ�Ķ����������Vector�У����Բ���֪�������Ƿ�����ܹ���¡��
(4) ��ʵ��Cloneable()�����ǽ�clone()���dz�protected��ʹ�κ��ֶζ�������ȷ�ĸ�
����Ϊ������һ�����������̳е����ж������ܸ���clone()��������super.clone()
��������ȷ�ĸ�����Ϊ��ע��������ʵ�ַ�������Զ���Ӧ�õ���super.clone()����
��ʹ�Ǹ���������Ԥ�ڵ���һ��Cloneable�����������һ��Υ����Ϊû���˻�
�������������͵Ķ�����ֱ�ӵ�������ֻ��ͨ��һ����������ã����Ǹ���������˵
�����Ҫ��֤����������ʵ��Cloneable��
(5) ��ʵ��Cloneable�����ŷ�ֹ��¡��������clone()���Բ���һ��Υ��Ϊʹ��һ��
��˳��ʵ�֣�ֻ�����������������κ���������¶�����clone()���suepr.clo
ne()��
(6) ������Ϊfinal���Ӷ��ֹ��¡����clone()��δ�����ǵ��κ�һ���ϼ��า�ǣ���
һ����㲻��ɹ������ѱ����ǣ���ô��һ�θ������������һ��CloneNotSuppor
tedException����¡��֧�֣�Υ��Ϊ������¡����ֹ��������Ϊfinal��Ψһ�İ취��
������⣬һ���漰���ܶ������������Դ����Ķ����������п��Ƶ����������Ӧ��
�����й���������Ϊprivate�����ṩһ����������ⷽ�����������������ַ�ʽ
����Щ�����Ϳ������ƴ����Ķ��������Լ����ǵĴ�����������һ����������ǵ�16��
Ҫ���ܵ�singleton�����ӣ�������
������������ܽ��˿�¡�ĸ���ʵ�ַ�����Ȼ���ڲ�νṹ�н��䡰�رա���
564-565ҳ����
��һ����Ordinary����Ŵ���ڱ�����������ࣺ��֧�ֿ�¡����������ʽӦ��
�Ժ�ȴҲ����ֹ�����¡����������һ��ָ��Ordinary����ľ������Ǹ������
���Ǵ�һ������������������������ģ��㲻���ж�����ܲ��ܿ�¡��
WrongClone���ʾ��ʵ�ֿ�¡��һ�ֲ���ȷ;������ȷʵ������Object.clone()������
�Ǹ�������Ϊpublic����ȴû��ʵ�� Cloneable������һ��������super.clone()�ĵ���
�����ڶ�Object.clone()��һ��������ɵģ��������������� CloneNotSupportedEx
ception��
��IsCloneable�У���ҿ����IJ��ǽ��п�¡�ĸ�����ȷ�ж����ȸ���clone()����ʵ��
��Cloneable�����ǣ����clone()�����Լ���������⼸��������������CloneNotSupp
ortedExceptionΥ�����������ͨ����ݸ�����ߡ�������߱�����һ�� t
ry-catch���������Χ�������������Լ���clone()�����У�ͨ����Ҫ��clone()�ڲ�
���� CloneNotSupportedExceptionΥ�����������ͨ���������Ժ��������
������������˵������ͨ��������ȷ��������
��NoMore��ͼ����Java����ߴ��������رա���¡����������clone()�У���������
CloneNotSupportedExceptionΥ��TryMore���е�clone()������ȷ�ص���super.clo
ne()���������� NoMore.clone()����������һ��Υ���ֹ��¡��
�����ѱ����ǵ�clone()�����У���������Ա�����ص���super.clone()�ġ���ȷ������
���ֻ����ʲô����أ���BackOn�У���ҿɿ���ʵ�ʻᷢ��ʲô���������һ������
�ķ���duplicate()������ǰ�����һ������������clone()�ڲ������������������
���� super.clone()��Υ����Զ���������������ǿ��Կ�¡�ġ���ˣ����Dz�����
����������һ��Υ��ķ�������ֹ����һ���ɿ�¡���ࡣΨһ��ȫ�ķ�����ReallyNoMo
re�еõ�����ʾ������Ϊfinal�����Բ��ɼ̳С�����ζ�ż���clone()��final��������
��һ��Υ��㲻��ͨ��̳��������ģ�������Ч�ؽ�ֹ��¡�����ܴ�һ��ӵ������
�̳м����������ȷ����Object.clone()��ֻ�ܵ���super.clone()����ֻ�ɷ���ֱ�ӻ�
���ࣩ����ˣ�ֻҪ����һЩ�漰��ȫ����Ķ�����ð���Щ����Ϊfinal��
����CheckCloneable�У����ǿ����ĵ�һ������tryToClone()�����ܽ����κ�Ordinary
������instanceof������Ƿ��ܹ���¡�������ǿ϶��ģ��ͽ��������ͳ�Ϊһ��
IsCloneable������clone()������������ͻ�Ordinary������п��ܲ�����κ�Υ
����ע�������������ͼ����11�£���ӡ������ʹ�Լ����������һ�������
��main()�У����Ǵ����˲�ͬ���͵�Ordinary���������鶨�����������ͳ�ΪOrdi
nary������֮���ͷ���д��봴����һ������� Ordinary������ͼ�����¡��Ȼ��
����Щ���벻��õ����룬��Ϊclone()��Object�е�һ��protected���ܵ������ģ���
��������ʣ��IJ��ֽ��������飬�����ſ�¡ÿ�����ֱ𱨸����ǵijɹ���ʧ�ܡ�
������£�
567-568ҳ����
��֮�����ϣ��һ�����ܹ���¡����ô��
(1) ʵ��Cloneable�ӿ�
(2) ����clone()
(3) ���Լ���clone()�е���super.clone()
(4) ���Լ���clone()�в���Υ��
��һϵ�в����ܴﵽ�������Ч��
12.3.1 ����������
��¡������Ҫ����зdz����ӵ����ã��ƺ���������һ�������һ���취��������
��Ĺ����������为����һ��������C++�У�����������������������տ�ʼ��ʱ��
���������һ�ַdz���Ȼ�Ľ���������������C++����Ա����������������У�����
����һ��ʵ�ʵ����ӣ�
568-571ҳ����
������ӵ�һ�ۿ���ȥ�Ե��е���֡���ͬˮ��������϶�������𣬵�Ϊʲôֻ�ǰ�
�����Щ��������ݳ�Աֱ������Fruit��ˮ���ࣿ����������ܵ�ԭ��һ������
�ǿ�������ز������������ע��Fruit��һ��protected���ܵ������ģ�addQuali
ties()��������������������������Щ������IJ�������һ������Ϊ��Ϻ�����
��������Fruit��ʹ��һ��protected�������������ȡFruitQualities���������
���ܼ̳У����Բ����ڵڶ���������������ʹ����ͨ��ˮ�����������һ��
�������࣬���Եõ���������ԣ����а����������ض� Fruit����Ĵ����ڼ���;��
��������
֮���Խ�FruitQualities��Ϊһ�������Ķ�����һ��ԭ���ǿ��ǵ�������ʱϣ�����
�µ�����������ͨ��̳�������Ըı���Ϊ��ע��� GreenZebra��˵����ʵ����������
��һ�ࡪ���������ֳɹ������Ǽ�ֱ�����������ţ��������������addQualities()��
��Ϊ�䴫��һ�� ZebraQualities���ö����Ǵ�FruitQualities��������ģ�������
������е�FruitQualities�����ϵ��һ�𡣵�Ȼ��һ��GreenZebraʹ��FruitQuali
ties���ͱ��뽫���������ͳ�Ϊ��ȷ�����ͣ�����evaluate()��չʾ�����������
��֪��������ZebraQualities��
���Ҳ������һ��Seed�����ӣ��࣬Fruit����Ҷ�֪����ˮ�����Լ������ӣ�����
һ��Seed���顣
���ע��ÿ�����һ������������������ÿ���������������������Ϊ����ͳ�
Ա������ø��������������⣬�Ӷ��á���㸴�ơ���Ч��Ը����������IJ�����
��CopyConstructor���ڽ��еġ�����ripen()��Ҫ��ȡһ��Tomato�������ִ�и�
�������������Ա㸴�ƶ���
t = new Tomato(t);
��slice()��Ҫ��ȡһ������Fruit�����Ҷ�����и��ƣ�
f = new Fruit(f);
���Ƕ���main()�а��治ͬ�����Fruit���в��ԡ�������������
572ҳ�ϳ���
���п��Կ���һ�����⡣��slice()�ڲ���Tomato�����˸������������Ժ��㲻��
��һ��Tomato����ֻ��һ��Fruit�����Ѷ�ʧ����Ϊһ��Tomato������������������
�������⣬������һ��GreenZebra��ripen()��slice()�����ֱ�ת����һ�� Tomat
o��һ��Fruit�����Էdz����ң����������������һ�����ظ�����Java�еĸ���������
�㲻���ر��ʺ����ǡ�
1. Ϊʲô��C++�����ñ���Java�д�
������������C++��һ�����ɲ��֣���Ϊ�����Զ���������һ�����ظ�������ǰ��
������ȷʵ֤�������ʺ���Java��ʹ�ã�Ϊʲô�أ���Java �У����Dzٿص�һ�ж���
���Ǿ�����C++�У�ȴ����ʹ�������ھ��Ķ�����Ҳ��ֱ�Ӵ��ݶ�����ʱ��Ҫ��
��C++�ĸ�����������ֻҪ����һ��������ֵ������Ϳ��Ը��ƶ�����������
C++���ܺܺõع�������Ӧע����������Java���Ǻܲ�ͨ�ģ����Բ�Ҫ����
12.4 ֻ����
������һЩ�ض��ij��ϣ���clone()����ı��ظ����ܹ��������ϣ��Ľ������Ա
�����������ߣ����ò����Խ�ֹ������ĸ����á�����������һ���⣬������г���
��;����ȴ���ܵ�����϶�������ȷ�����е��Կ�¡����ʱ�ָ���ô���أ����п��ܵ�
һ������ǣ������������ñ���ӻ�����á�����ֹ����Ҫ�Ķ����ơ�����ȴ��
ϣ���ɴ���ɵĸ����ã���ô�ָ���δ����أ�
һ���취�Ǵ���������������������ֻ���ࡣ�ɶ���һ��������࣬ʹ����û��
�κη�������ɶ����ڲ�״̬�ĸı䡣�������һ�����У���������û������ġ���
Ϊ����ֻ�ܶ�ȡ�ڲ�״̬�����Ե��ദ���붼��ȡ��ͬ�Ķ���ʱ����������κθ�����
��
��Ϊ���������һ�������ӣ�Java�ı�����ˡ���װ������wrapper���࣬����
�����л�������͡���ҿ����ѷ�������һ�㣬�������һ����Vector��ֻ����Obje
ct�������ļ����ﱣ��һ��int��ֵ�����Խ����int��װ�������Integer���ڲ�
��������ʾ��
573ҳ�г���
Integer�ࣨ�Լ���ġ���װ�����ࣩ�ü���ʽʵ���ˡ������ԡ�������û���ṩ
������������
��ȷʵ��Ҫһ�������˻�������͵Ķ�����Ի�������ͽ����ģ��ͱ�����
�Դ������ǡ����˵��ǣ������dz���
573-574ҳ����
ע��n������������ǵı��롣
��Ĭ�ϵij�ʼ��Ϊ���Ѿ��㹻���㲻��Ҫ�������������Ҳ��ÿ��ǰ����ӡ�������㲻
��ҪtoString������ôIntValue�������ܸ�Ӽ�������ʾ��
class IntValue { int n; }
��Ԫ��ȡ�������ٶ���������ͣ�������Ե���Щ����������Vector�����⣬����In
tValue�Ĵ?
12.4.1 ����ֻ����
��ȫ���Դ����Լ���ֻ���࣬�����Ǹ������ӣ�
574-575ҳ����
������ݶ���Ϊprivate�����Կ���û���κ�public��������������ġ���ʵ�ϣ�ȷʵ
��Ҫ��һ������ķ�����quadruple()��������������½�һ��Immutable1����ʼ
��������ԭ��δ���ġ�
����f()��Ҫȡ��һ��Immutable1���������ȡ��ͬ�IJ�������main()�������ʾ��
û�ж�x���κ��ġ���ˣ�x����ɱ��������Σ���������κ��˺�����Ϊ���Im
mutable1�����ƣ����ܱ�֤�����Ķ���
12.4.2 ��һ�ɲ��䡱�ı�
�ӱ��濴��������Ľ����ƺ���һ���÷��������ǣ�һ�������Ҫ���������͵�һ����
�ĵĶ��ͱ�������ؽ����¶���Ĵ���������ͬʱ���п����漰��Ƶ���������ռ�
������Щ����˵��������Ⲣ���Ǻܴ�����������˵������String�ࣩ����һ����
�Ĵ���Ե�̫���ˡ�
Ϊ���������⣬���ǿ��Դ���һ����ͬ־���࣬��ʹ���ܹ��ġ��Ժ�ֻҪ�漰����
���Ĺ������Ϳɻ�Ϊʹ�����ĵ�ͬ־�ࡣ�����Ժ����л��ز��ɱ���ࡣ
��ˣ�����ɸij�����������ӣ�
575-577ҳ����
����һ��Immutable2��ķ��������˶��ɱ��������ֻҪ�漰�ģ��ʹ���
�µĶ��������Щ��������add()��multiply() ������ͬ־�����Mutable����Ҳ����
add()��multiply()����������Щ�����ܹ���Mutable�������½�һ���������
�⣬ Mutable��һ���������������ݲ���һ��Immutable2����֮��Ȼ��
������̬����modify1()��modify2()��ʾ�����ͬ��������ֲ�ͬ��������modify1(
)�У����й���������Immutable2������ɵģ����ǿɿ����ڽ���д������ĸ��µ�Imm
utable2������ÿ�����·�����val��ǰһ������ͳ�Ϊ����
�ڷ���modify2()�У��ɿ�����ĵ�һ���ж��ǻ�ȡImmutable2 y��Ȼ��������һ��M
utable��������ǰ���clone()�ĵ��ã�����һ�δ�����һ����ͬ���͵Ķ������
��Mutable������д����IJ�����ͬʱ�ò����½�������������л���Immutab
le2�����������ֻ�����������¶���Mutable��Immutable2�Ľ�������ĸ�
��
��һ�����ر��ʺ�����������Ӧ�ã�
(1) ��Ҫ���ɱ�Ķ�����
(2) ������Ҫ���д����ģ�����
(3) �����µIJ��������̫��
12.4.3 �����ִ�
��۲��������룺
577-578ҳ����
q���ݽ���upcase()ʱ����ʵ����q�ľ���һ���������þ�����ӵĶ���ʵ��ֻ��һ��
ͳһ������λ�ô�������Ĵ����ݵ�ʱ����ľ���õ����ơ�
���۲��upcase()�Ķ��壬�ᷢ�ִ��ݽ���ľ����һ������s�����Ҹ�����ֻ����upc
ase()ִ���ڼ�Ż���ڡ�upcase()��ɺ��ؾ��s�����ʧ����upcase()���ؽ��
��������ԭ���Ǹ��ִ���ֻ�������ַ����˴�д����Ȼ����ص�ʵ���ǽ���һ
�������صľ��������Ϊһ���¶���ģ�ͬʱԭ����q��δ����仯��������Щ
����η�����أ�
1. ��ʽ����
��ʹ��������䣺
String s = "asdf";
String x = Stringer.upcase(s);
��ô���ϣ��upcase()�����ı��Ա������߲���������ͨ���Dz�Ը��ģ���Ϊ��Ϊ��
������һ����Ϣ���Ա���һ�����ø����Ķ��߿��ģ������������ġ�����һ
���൱��Ҫ�ı�֤����Ϊ��ʹ������ױ�д����⡣
Ϊ����C++��ʵ����һ��֤����Ҫһ������ؼ��ֵİ���const����������ؼ��֣���
��Ա���Ա�֤һ�����C++�С�ָ�롱���ߡ����á������ᱻ������ԭʼ�Ķ���
����һ����C++����Ա��Ҫ���ļ�ס�����еط���ʹ��const������Ȼ��ʹ�˻���Ҳ��
����ס��
2. ����"+"��StringBuffer
����ǰ���ᵽ�ļ�����String��Ķ�����Ƴɡ����ɱ䡱�������������ĵ��й���St
ring������ݣ������Ժ�Ҫ�ܽ���ͻᷢ�������ܹ��� String��ÿ������ʵ��
�������ͷ�����һ��ո�µ�String�����¶���������Ĺ����Ϣ����ԭ����Stri
ng��ԭ��δ���ġ���ˣ�Java ��û����C++��const��Ӧ�����Կ������ñ�����֧�ֶ���
�IJ��ɱ���������������һ�����������������ã�����String����
����String�����Dz��ɱ�ģ������ܹ���������һ���ض���String���ж�α�����
����Ϊ����ֻ���ģ�����һ�������ܻ�ı�һЩ��Ӱ��������Ķ�������ˣ�ֻ
��������Ժܺõؽ���������⡣
ͨ���IJ�������һ��ո�°汾���ƺ����Խ���Ķ���ʱ���������⣬����String
������ijЩ�������������ַ�����Ч�ʲ����ߡ�һ�����͵����ӱ���ΪString����
���ǵ������+���������ǡ���ζ������һ���ض�����ʹ��ʱ����ĺ����ѷ����˱仯
������String�ġ�+���͡�+=����Java ���ܱ����ǵ�Ψһ�����Java���������Ա��
�������κ������ע�͢ܣ���
�ܣ�C++�������Ա���⸲�������������ͨ����һ�����ӵĹ�̣��μ�Thinking
in C++����Prentice-Hall��1995����棩������Java��������϶�����һ��
--
j&= y+ y* jv+ yy-v v &
wE!" j17$T 7MPC NU$E- Ej&v-
O*K^ yHH:Ovm+ UMMk BMNTO: H1="7'
jO&OH: "OH&"E~ U0H1 BB71` jCf'U:
vM1H1 jB-j1 wHhHh*-/$B)B- BkJUk
^HI'OH j""^N1 "OHOK~ H$H"Da jP'N ^
[m[1;35m�� ��Դ:���ɽ��ˮ bbs.neu.edu.cn��[FROM: 219.216.70.3][m
Technical Details
Message-ID:
<492eDd$Bi_@bbs.neu.edu.cn>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!wn14feed!worldnet.att.net!207.35.177.252!nf3.bellglobal.com!sjc70.webusenet.com!news.webusenet.com!news.neu.edu.cn!NEUShow Full Headers
Complete Article Headers
X-Google-Language: Chinese,GB X-Google-Thread: f6cb0,8299eb71c5f33918,start X-Google-Attributes: gidf6cb0,public X-Google-ArrivalTime: 2003-10-27 17:48:11 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news2.google.com!news.maxwell.syr.edu!wn14feed!worldnet.att.net!207.35.177.252!nf3.bellglobal.com!sjc70.webusenet.com!news.webusenet.com!news.neu.edu.cn!NEU From: amou.bbs@bbs.neu.edu.cn (�˺�2��) Newsgroups: cn.bbs.comp.lang.java Subject: Java���˼��---��12�� ���ݺͷ��ض��� Date: 28 Oct 2003 01:47:20 GMT Organization: ��ɽ��ˮ Message-ID: <492eDd$Bi_@bbs.neu.edu.cn> Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit X-Filename: java/M.1067305623.A Lines: 515