当覆盖Java中的预定义方法时......
答案是什么? 1或2
我知道当我们覆盖超类中的方法时,方法签名应该是相同的。但继承怎么样?我在一本书中读过这个问题,但即使经过一些研究,我也没有找到任何答案。
答案 0 :(得分:1)
具有相同签名(名称,加上其参数的数量和类型)的子类中的实例方法以及作为超类中的实例方法的返回类型将覆盖超类的方法。
方法签名必须相同;也就是说,名称,参数,参数位置和参数数量必须匹配。
最常见的例子是toString()
,它位于Object
。 Object
' 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
的任何内容,例如ArrayList
和LinkedList
。
要扩展一点:孩子中方法的可见性也起作用。
从handy chart开始,具有private
修饰符的方法无法传递给子类。
覆盖方法时,无法降低方法的可见性;也就是说,您不能在提供的可见性顺序中下降。
为了提供帮助,请点击此处。
如果您父母的方法是......
public
:子类&#39;覆盖必须为public
。protected
:子类&#39;覆盖可以是public
或protected
。<no modifier>
或package-private:子类&#39;覆盖可以是public
,protected
或包私有。private
:子类甚至不知道存在的方法。