public class InstrumentedHashSet<E> extends HashSet {
private long count;
@Override
public boolean add(Object o) {
count++;
return super.add(o);
}
@Override
public boolean addAll(Collection collection) {
count += collection.size();
return super.addAll(collection);
}
public long getCount() {
return count;
}
public static void main(String[] args) {
HashSet hashSet = new HashSet(3);
hashSet.add(1);
hashSet.add(2);
hashSet.add(3);
InstrumentedHashSet<Integer> instrumentedHashSet = new InstrumentedHashSet<>();
instrumentedHashSet.addAll(hashSet);
//结果输出为6,而非3
System.out.println(instrumentedHashSet.getCount());
}
}
---------------------
这里首先调用了instrumentedHashSet的对象的addAll,然后count变成3,之后调用super.addAll,也就是调用了hashset的addAll,hashset里的addAll应该调用了hashset的add吧?那为什么count会是6,不应该就是3吗?
我调试了下程序,发现是hashset里的addAll调用的是InstrumentedHashSet的add,这是为什么呢?因为add方法被覆盖的缘故吗?父类自己调自己的方法,结果发现被子类覆盖了,就调子类的方法了?
子类调用方法A,如果没被覆盖则调用父类的方法A,如果被覆盖,则调用自身的方法A。
父类调用自己方法A,还要去看是否被子类覆盖的吗?有点懵。
问题抛出:这究竟是怎样的调用链呢?(把自己的思路都写上来了,可能有些凌乱,新手勿喷...)
我java不熟,但是我从js的角度也得出了同样的结果,你的问题可以变成如下的最小模型
因为child的自身身上已经有了所以无需往parent身上找了
java也是类似