大话深入浅出Effective Java核心实战编程思想之猴王的把戏

不知道大家还记不记得在《西游记》里的莲花洞夺宝的故事,就是猴王巧夺宝物,收复金银角大王那 一章。到底这个故事给了我们什么启示呢?这故事又和Effective Java有什么联系?还是延续上篇文章的 风格吧,看代码,读故事。

  1import static org.junit.Assert.*;
2import org.junit.Test;
3
4
5public class TestClone {
6
7    @Test
8    public void testClone(){
9        // 西天取经的路上,金角大王和银角大王把唐僧抓走了
10         猴王 齐天大圣=new 猴王("齐天大圣孙悟空");
11        //大圣手拿金 箍棒,正要收拾金、银角大王。
12        齐天大圣.取得武器(new 金箍棒());
13
14        /**//*
15         * 这时候,金角大王和银角大王听闻大圣 来者不善,立马让小妖去请出他们的宝葫芦
16         * 当然这一切瞒不过神通广大的 大圣爷。大圣猴毛一吹,变出一个老道士。
17         */
18        猴王 空悟孙道士=(猴王)齐天大圣.变出一个化身();
19        空悟孙道士.改名("空悟孙道 士");
20
21        /**//*
22         * 老道士忽悠小妖说他的葫 芦更厉害,能把天都给收了,智力值只有20的小妖看了羡慕不已,要求交换葫芦。
23          * 老道士自然很乐意,换了葫芦,直奔妖怪洞穴,收服了金、银角大王。
24          */
25        空悟孙道士.取得武器(new 宝葫芦());
26
27        //问题1:道士拿的是什么武器?道士是由大圣克隆而来,拿的却不是金箍棒,而是宝葫芦?
28         assertFalse(齐天大圣.的武器() instanceof 金箍棒);
29        assertTrue(空悟孙道士.的武器() instanceof 宝葫芦);
30
31        //问题2:大 圣和道士拿同一个武器?
32        assertSame(空悟孙道士.的武器(),齐天大圣.的武器 ());
33
34        //问题3:既然武器是一样的,为什么名字又不一样呢?
35         assertEquals(齐天大圣.名字(),"齐天大圣孙悟空");
36        assertEquals(空悟孙道士.名字(),"空悟孙道士");
37
38        /**//*
39          * 答案:猴王类继承了Object.clone(),其克隆原理是:如果类每个域包含一个原语类 型(primitive)的值,
40         * 或者包含一个指向非可变(final)对象的引用, 那么返回的值或对象是一个相同的拷贝;否则,如果是可变类,则会返回相同的引用。
41          * 因为金箍棒类不是非可变类,而String是,所以你应该明白,为什么大圣爷和他的克隆体有 不同的名字,却有相同的武器吧。
42         *
43         * Object.clone()被称为浅拷贝,或浅克隆。相对应的是深克隆(deep clone),他是指类在克隆时也拷贝 可变对象。
44         * 看到这里你应该知道其实这个猴王类实现得不合理,他应该拥 有一个深克隆的方法。
45         */
46    }
47
48    class 猴王 implements Cloneable{
49        private String name;
50        private 武器[] weapon=new 武器[1];
51
52        public 猴王(String name) {
53            this.name=name;
54        }
55
56         /** *//**
57         * 取得一个猴王的浅克隆化身
58          * @return
59         */
60        public Object 变出一个化身 (){
61            Object cloneObj=null;
62            try {
63                cloneObj=clone();
64            } catch(CloneNotSupportedException ex){
65                ex.printStackTrace();
66            }
67            return cloneObj;
68        }
69
70        @Override
71         protected Object clone() throws CloneNotSupportedException{
72             return super.clone();
73        }
74
75        public String 名字() {
76            return name;
77        }
78
79         public void 改名(String name){
80            this.name=name;
81        }
82
83        public 武器 的武器() {
84            return weapon[0];
85        }
86
87         public void 取得武器(武器 weapon) {
88            this.weapon [0] = weapon;
89        }
90    }
91
92    class 武器{
93        public 武器(){
94
95        }
96    }
97
98    class 金箍棒 extends 武器{
99        public 金箍棒(){
100         }
101    }
102
103    class 宝葫芦 extends 武器{
104         public 宝葫芦(){
105        }
106    }
107
108
109}
110

时间: 2024-11-01 20:32:50

大话深入浅出Effective Java核心实战编程思想之猴王的把戏的相关文章

学点Java里的编程思想(r12笔记第65天)

   按照自己之前的计划,我觉得得看看关于开发的东西了,因为我对于并发,锁的认知总是有一个局限性,自己也在地铁上做了些功课.有了这个想法,再有拿起书的勇气,那就是一个开始了.    每个圈子都有自己喜爱的图书,就如同Oracle圈子对于Tom的<Oracle编程艺术>,MySQL圈子对于<高性能MySQL>,Java圈子也有自己的,在我的印象中,应该就是<Java编程思想>了.    程序员其实还是容易偏执,在我们的生活中这种例子屡见不鲜,比如php是世界上最好的语言,

全方位讲解Java的面向对象编程思想_java

什么是面向对象?Object 对象,Oriendted 以-为导向的, Programming 程序设计 面向对象就是使用对象进行程序设计,简写成OOP. SP和OOP对比 面向对象的三大原则      封装  继承   多态 对象 对象是面向对象编程的核心部分,是实际存在的具体实体,具有明确定义的状态和行为: 对象其实就是"数据"和"函数"的封装体,其中: 数据表示自身的状态,也称作"属性"或"成员数据": 函数表示自身的功

java编程思想第4版有两个版本吗?

问题描述 如题本人刚学java在网上下了本pdf格式的但电脑上看费劲今天去图书馆借了本回来都是机械工业出版社的第四版为什么不一样呢电子书的有17章600多页图书馆的有22章800多页有人知道为什么么?最重要的是哪个比较好?? 解决方案 解决方案二:肯定是纸质靠谱了!哥们儿下了个残本?解决方案三:确定是第四版?电子版的不是以前的版本吧,还是拿本厚书看吧解决方案四:不是什么好书就听网上吹把解决方案五:那你有什么好书推荐么?虚心求教解决方案六:Java从入门到精通,我老师出的啊解决方案七:恩感谢你的介

Java核心编程实践--视频

Java核心编程实践--视频 下载地址:http://v.51work6.com/courseInfoRedirect.do?action=courseInfo&courseId=240577    图形用户界面的开发是本教程的重点,图书管理系统是使用图形界面开发的.集合框架是非常重要的内容,通过本教程的学习使学员掌握两大接口Collection和Map,还有List等,以及它们的实现类ArrayList.Vector和HashMap等.使用Collections类实现对集合的排序.最大值.最小

java-求大神推荐几本关于Java编程思想的书

问题描述 求大神推荐几本关于Java编程思想的书 有时结果总是超乎自己的想象,可能是自己的思维模式跟不上计算机的算法 解决方案 建议你还是多做些联系,参与一些项目练练实际经验吧,看编程思想的书时需要一定基础的. 解决方案二: thinking in java 解决方案三: effective java

关于继承内部类——java编程思想示例程序分析

编程|程序|继承|示例 关于继承内部类--java编程思想示例程序分析:class Egg2 { protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { System.out.println("Egg2.Yolk.f()"); } } private Yolk y = new Yolk(); public Egg2() { System

Java核心编程卷1:基础

现在已经步入了21世纪,我们很难想象曾经Java相关的图书是那样的稀少,但这就是Java刚出现时的情况.那时所有与Java相关的图书基本上都是由Sun公司的几个工程师们所发布的,比如说Arthur Van Hoff et.al所写的"Hooked on Java"以及Patrick Naughton所写的"The Java Handbook". 当然了,这些图书填补了Java的空白,不过每本书都有3.400页,这些图书都假设读者了解程序,特别是面向对象程序设计. 1

《Java 7并发编程实战手册》第六章并发集合

由人民邮电出版社出版的<Java 7并发编程实战手册>终于出版了,译者是俞黎敏和申绍勇,该书将于近期上架.之前并发编程网组织翻译过此书,由于邮电出版社在并发网联系他们之前就找到了译者,所以没有采用并发网的译稿,但邮电出版社将于并发网展开合作,发布该书的样章(样章由并发网挑选,你也可以回帖告诉我们你想看哪一章的样章),并组织赠书活动回馈给活跃读者.活动详情请时刻关注并发网的微博和微信(微信号:ifeves),最后祝各位用餐愉快!:) 本章将介绍下列内容: 使用非阻塞式线程安全列表 使用阻塞式线程

学习JAVA编程思想4的好方法

问题描述 跪求大神总结学习JAVA编程思想4的好方法. 解决方案 解决方案二:Java编程思想是很好的学习Java的材料,但对初学者来说有的地方不是能够轻易明白的.因为Java涉及的概念和技术非常广泛,建议先把基础夯实,比如类,接口,继承,多态等,这些有了基础后可以再深入学习正则表达式.线程.io等,一定要动手编写代码,并确实明白代码的执行逻辑.解决方案三:1.背把那些死知识背下来,复习巩固2.敲可以按书本例子课后题敲,对没掌握的可以重复敲3.测找其他题测试掌握情况,最好找SCJP题库的题,因为