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