为什么main函数返回意外的执行结果?

时间:2015-06-07 16:59:00

标签: java inheritance composition software-design

我想了解源代码:

public class InstrumentedSet extends HashSet {
    // Keeps the number of attempted element insertions

    private int addCount;

    public InstrumentedHashSet(Collection c) {
        super(c);
    }

    public boolean add(Object o) {
      addCount++;
      return super.add(o);
    }

    public boolean addAll(Collection c) {
      addCount += c.size();
      return super.addAll(c);
    }

    public int getAddCount() {
      return addCount;
    }

    public static void main(String[] args) {
      InstrumentedHashSet s = new InstrumentedHashSet();
      String s1[] = new String[] {"Snap","Crackle","Pop"};
      s.addAll(Arrays.asList(s1));
      System.out.println(s.getAddCount());
      }
    }
}

我无法理解为什么main函数会返回执行值6 而不是返回值3

2 个答案:

答案 0 :(得分:1)

嗯,除了你当前的代码没有编译的事实,它可以解释这种行为。

您在新的/bin/sh(或cmd.exe)实例上调用addAll,此方法如下所示:

InstrumentedHashSet

首先你要向InstrumentedSet添加3,因为之前该变量是0,所以它也是3。 然后,您正在调用addCount += c.size(); return super.addAll(c); addCount的{​​{1}},the implementation of it如下:

addAll

最重要的部分是super声明:HashSet。它会为传递的public boolean addAll(Collection<? extends E> c) { boolean modified = false; for (E e : c) if (add(e)) modified = true; return modified; } 中的每个项目调用if,因为您使用自己的实现overriden该方法:

if (add(e))

...将调用该方法而不是父实现。在这里,您为每个添加的元素增加add。所以你现在正在计算每个元素的时间 这基本上是Collection打印public boolean add(Object o) { addCount++; return super.add(o); } 传递的addCount的两倍数量的原因。

答案 1 :(得分:1)

这是因为HashSet方法的addAll方法调用add方法的实现,并且由于多态性,InstrumentedSet.add被调用。

addCount += c.size();实施中删除InstrumentedSet.addAll,它将有效。