我有一个类 myHashSet,它扩展了 HashSet 类。 myHashSet 覆盖了 HashSet 的 add() 和 addAll() 方法。所以我有以下代码片段:
class MyHashSet<E> extends HashSet<E> {
@Override
public boolean add(E e){
return super.add(e);
}
@Override
public boolean addAll(Collection ? extends E> c){
return super.addAll(c);
}
}
我知道,addAll 方法是通过 add() 实现的,这意味着它使用 add() 方法。所以,如果我调用 MyHashSet 的 addAll(),它应该调用 HashSet 的 addAll(),而后者又应该调用 HashSet 的 add()。但是为什么当我调用 MyHashSet 的 addAll() 时它调用 MyHashSet 的 add()?
我在这里很困惑,如果这个问题很愚蠢,我很抱歉。
最佳答案
这就是多态性的工作方式。
如果您有类层次结构 A 和 B,其中 B 扩展了 A,并且您有覆盖方法 foo()
,当您调用它时,子类的方法将被执行。语法 super.foo()
允许调用父类(super class)的方法版本。但是如果父类(super class)的方法调用 bar()
它将调用子类中编写的版本。想一想:这允许继承工作,因为您可以覆盖子类中父类(super class)的方法并更改功能。
关于java - 为什么super.addAll会调用重写的add方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16476716/