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

时间:2015-06-15 05:18:12

标签: java inheritance method-overriding

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

  1. 只有方法签名必须相同
  2. 方法签名和继承必须相同
  3. 答案是什么? 1或2

    我知道当我们覆盖超类中的方法时,方法签名应该是相同的。但继承怎么样?我在一本书中读过这个问题,但即使经过一些研究,我也没有找到任何答案。

1 个答案:

答案 0 :(得分:1)

From the docs

  

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

方法签名必须相同;也就是说,名称,参数,参数位置和参数数量必须匹配。

最常见的例子是toString(),它位于ObjectObject' toString方法的定义如下:

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

...而AbstractCollection *' s 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

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

handy chart开始,具有private修饰符的方法无法传递给子类。

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

为了提供帮助,请点击此处。

如果您父母的方法是......

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