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

Java 为什么主函数返回意外的执行结果?,java,inheritance,composition,software-design,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) {

我正在努力理解源代码:

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());
      }
    }
}

我不明白为什么主函数返回执行值6而不是返回值3,除了当前代码没有编译之外,还可以解释这种行为

您正在对新的
InstrumentedHashSet
(或
InstrumentedSet
)实例调用
addAll
,此方法如下所示:

addCount += c.size();
return super.addAll(c);
首先,将3添加到
addCount
中,由于该变量之前为0,因此也将是3。
然后调用
super
HashSet
addAll
,如下所示:

addCount += c.size();
return super.addAll(c);
。。。将调用该方法而不是父实现。在这里,您将为每个添加的元素增加
addCount
。因此,您现在再次计算每个元素。

这就是为什么
System.out.println(s.getAddCount())
打印从
数组传递的
集合的双倍数量。asList(s1)

这是因为
HashSet
实现了
addAll
方法调用
add
方法,并且由于polymorhphism,调用了
InstrumentedSet.add


删除
addCount+=c.size()来自
InstrumentedSet.addAll
实现,它会工作。

为什么它会返回3?因为我们正在迭代3个字符串。迭代3个字符串的位置以及这与计数有什么关系?向方法中添加一些
println
语句(或在调试器中逐步执行),所有这些都应该清楚。你能提供编译的代码吗?这将有助于重现你的问题。
public boolean add(Object o) {
    addCount++;
    return super.add(o);
}