设计思想之复合应该优于继承
2016-04-10 12:07
225 查看
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
@SuppressWarnings("serial")
public class HashSetAddRequest<E> extends HashSet<E>{
private int addCount=0;
public HashSetAddRequest(int index,float val){
super(index,val);
}
public HashSetAddRequest(){
}
@Override
public boolean add(E e)
{
addCount++;
return super.add(e);
};
@Override
public boolean addAll(Collection<? extends E> arg0)
{
addCount+=arg0.size();
return super.addAll(arg0);
}
public int getAddCount(){
return this.addCount;
}
public static void main(String[] args)
{
HashSetAddRequest<String> strs=new HashSetAddRequest<String>();
strs.addAll(Arrays.asList("yc","navy","hh"));
System.out.println(strs.getAddCount());
}
}
大家思考下,上面程序运行后结果会是多少呢?是不是3呢?
哈哈,是不是运行之后发现并不是你们认为的3而是6呢?那么,哪个地方出错了呢?
其实,原因出在HashSet的内部。因为addAll()方法是基于它的add()方法来实现的,即使HashSet的文档中并没有说明这一实现细节。HashSetAddRequest中的addAll()方法首先给addCount增加了3,然后利用super.addAll()来调用HashSet的addAll()的实现,然后又依次调用到HashSetAddRequest中被覆盖了的add()方法,每个元素调用一次,所以最终结果变成了6。
同学们,大家了解了吗?
参考:effective java
import java.util.Collection;
import java.util.HashSet;
@SuppressWarnings("serial")
public class HashSetAddRequest<E> extends HashSet<E>{
private int addCount=0;
public HashSetAddRequest(int index,float val){
super(index,val);
}
public HashSetAddRequest(){
}
@Override
public boolean add(E e)
{
addCount++;
return super.add(e);
};
@Override
public boolean addAll(Collection<? extends E> arg0)
{
addCount+=arg0.size();
return super.addAll(arg0);
}
public int getAddCount(){
return this.addCount;
}
public static void main(String[] args)
{
HashSetAddRequest<String> strs=new HashSetAddRequest<String>();
strs.addAll(Arrays.asList("yc","navy","hh"));
System.out.println(strs.getAddCount());
}
}
大家思考下,上面程序运行后结果会是多少呢?是不是3呢?
哈哈,是不是运行之后发现并不是你们认为的3而是6呢?那么,哪个地方出错了呢?
其实,原因出在HashSet的内部。因为addAll()方法是基于它的add()方法来实现的,即使HashSet的文档中并没有说明这一实现细节。HashSetAddRequest中的addAll()方法首先给addCount增加了3,然后利用super.addAll()来调用HashSet的addAll()的实现,然后又依次调用到HashSetAddRequest中被覆盖了的add()方法,每个元素调用一次,所以最终结果变成了6。
同学们,大家了解了吗?
参考:effective java
相关文章推荐
- python编码格式
- 20145314郑凯杰 《Java程序设计》第6周学习总结
- POJ 3767 I Wanna Go Home【最短路floyd】
- OPENGGL深度测试
- setsockopt
- CentOS 服务器安全设置
- 关于如何提高sql语句执行效率(网上整理)
- 大鱼吃小鱼游戏代码 基于java-swing
- hdu-1428 漫步校园(BFS+记忆化搜索)
- 反射机制总结
- Unity中Microphone类进行录音保存
- 《机电传动控制》第六周学习笔记
- C++隐式转换与显式转换
- 如何在Linux中发现IP地址冲突
- [BZOJ2705][SDOI2012]Longge的问题
- 我的博客是如何搭建的(github pages + HEXO + 域名绑定)
- 让Java程序运行sudo命令
- SLT的代码(当然不是我写的,今天不小心炸出来了,纪念一下)
- SAP的组织架构
- System.out和System.err的并发