繁体   English   中英

在 Java 中重写方法时会发生什么?

[英]What happens when a method is overridden in Java?

当 Java 中的预定义方法被覆盖时...

  1. 只有方法签名必须相同
  2. 方法签名和继承必须相同

答案是什么? 1 或 2

我知道当我们重写超类中的方法时,方法签名应该是相同的。 但是遗产呢? 我在一本书上读过这个问题,但即使经过一些研究,我也没有找到任何答案。

从文档

子类中的实例方法具有与超类中的实例方法相同的签名(名称,加上其参数的数量和类型)和返回类型,将覆盖超类的方法。

方法签名必须相同; 即名称、参数、参数位置、参数个数必须匹配。

最常见的例子是toString() ,它存在于Object ObjecttoString方法定义如下:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

...而AbstractCollection * 的toString方法定义如下:

public String toString() {
    Iterator<E> it = iterator();
    if (! it.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = it.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! it.hasNext())
            return sb.append(']').toString();
        sb.append(',').append(' ');
    }
}

请注意,这两个方法签名是相同的,但它们返回的内容不同。 这是覆盖的意图; 您的父类为其定义了特定的行为,这在子类中不一定有意义,因此只需超越该行为并使其适合子类。

*:这用于任何属于AbstractCollection东西,例如ArrayListLinkedList


扩展一点:方法在孩子中的可见性也起作用。

从这个方便的图表中,不能将具有private修饰符的方法传递给子类。

覆盖方法时,不能降低方法的可见性; 也就是说,您不能按照提供的可见性顺序下降。

为了提供帮助,这里有一个快速列表。

如果您的父级中的方法是...

  • public :子类的覆盖必须public
  • protected :子类的覆盖可以是publicprotected
  • <no modifier>或包私有:子类的覆盖可以是publicprotected或 package-private 。
  • private :子类甚至不知道该方法存在

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM