摘要: 建议41: 让多重继承成为现实 在Java中一个类可以多重实现,但不能多重继承,也就是说一个类能够同时实现多个接口,但不能同时继承多个类。但有时候我们确实需要继承多个类,比如希望拥有两个类的行为功能,就很难使用单继承来解决问题了(当然,使用多层继承是可以解决的)。幸运的是Java中提供的内部类可以曲 阅读全文
posted @ 2016-04-25 22:35 SummerChill 阅读(484) 评论(0) 推荐(0) 编辑
摘要: 覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先来看如下代码: 代码中的Person类与上一建议相同(http://www.cnblogs.com/ 阅读全文
posted @ 2016-04-25 17:23 SummerChill 阅读(675) 评论(0) 推荐(0) 编辑
摘要: 建议47: 在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题。这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JEE中JavaBean有继承关系也很常见,代码如下: 输出结果: 很不给力嘛,p1竟然等于e1,也等于e2, 阅读全文
posted @ 2016-04-25 17:01 SummerChill 阅读(4188) 评论(0) 推荐(0) 编辑
摘要: 建议46: equals应该考虑null值情景 继续上一建议的问题,我们解决了覆写equals的自反性问题,是不是就很完美了呢?再把main方法重构一下: 很小的改动,那运行结果是什么呢?是两个true吗?我们来看运行结果: 竟然抛异常了!为什么p1就能在List中检查一遍,并且执行p1.equal 阅读全文
posted @ 2016-04-25 16:36 SummerChill 阅读(5845) 评论(0) 推荐(0) 编辑
摘要: 建议45: 覆写equals方法时不要识别不出自己 我们在写一个JavaBean时,经常会覆写equals方法,其目的是根据业务规则判断两个对象是否相等,比如我们写一个Person类,然后根据姓名判断两个实例对象是否相同,这在DAO(Data Access Objects)层是经常用到的。具体操作是 阅读全文
posted @ 2016-04-25 15:34 SummerChill 阅读(678) 评论(0) 推荐(0) 编辑
摘要: 建议44: 推荐使用序列化实现对象的拷贝 上一个建议说了对象的浅拷贝问题,实现Cloneable接口就具备了拷贝能力,那我们来思考这样一个问题:如果一个项目中有大量的对象是通过拷贝生成的,那我们该如何处理?每个类都写一个clone方法,并且还要深拷贝?想想看这是何等巨大的工作量呀,是否有更好的方法呢 阅读全文
posted @ 2016-04-25 14:57 SummerChill 阅读(741) 评论(0) 推荐(0) 编辑
摘要: 建议43: 避免对象的浅拷贝 我们知道一个类实现了Cloneable接口就表示它具备了被拷贝的能力,如果再覆写clone()方法就会完全具备拷贝能力。拷贝是在内存中进行的,所以在性能方面比直接通过new生成对象要快很多,特别是在大对象的生成上,这会使性能的提升非常显著。但是对象拷贝也有一个比较容易忽 阅读全文
posted @ 2016-04-25 12:31 SummerChill 阅读(974) 评论(0) 推荐(0) 编辑
摘要: 建议42: 让工具类不可实例化 Java项目中使用的工具类非常多,比如JDK自己的工具类java.lang.Math、java.util.Collections等都是我们经常用到的。工具类的方法和属性都是静态的,不需要生成实例即可访问,而且JDK也做了很好的处理,由于不希望被初始化,于是就设置构造函 阅读全文
posted @ 2016-04-25 11:32 SummerChill 阅读(2233) 评论(0) 推荐(0) 编辑
摘要: 建议40: 匿名类的构造函数很特殊 在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行加减乘除运算,代码如下: 代码的意图是,通过构造函数输入两个int类型的数字,然后根据设置的操作符( 阅读全文
posted @ 2016-04-25 11:19 SummerChill 阅读(1543) 评论(0) 推荐(0) 编辑
摘要: 建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: 注意ArrayList后面的不同点:l1变量后面什么都没有,l2后面有一对{},l3后面有2对嵌套的{},这段程序能不能编译呢?若能编译,那输出是多少呢? 答案是能编译,输出的是3个false。l1很容易解释,就是声明了ArrayL 阅读全文
posted @ 2016-04-25 11:11 SummerChill 阅读(4317) 评论(0) 推荐(0) 编辑