java - 为什么super.addAll会调用重写的add方法

标签 java

我有一个类 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/

相关文章:

Java 9 HttpClient : Correctly handle async response

java - jmonkey 旋转和平移

java - SSLEngine 展开() javax.crypto.BadPaddingException : bad record MAC

java - 在给定情况下使用 StringBuilder 构建字符串的最佳实践是什么?

java - "for (int clickableId : clickableIds)"有什么作用?

java - 有没有办法在mave中安装jar本地gradle存储库(maven install :install-file

java - Java中从最小到最大的排序列表

java - IntelliJ 无法使用 OpenJDK 11 识别 JavaFX 11

java 值对象

java - 使用 JDBC 语句执行查询时出现 NullPointerException