[英]What happens when a method is overridden in Java?
当 Java 中的预定义方法被覆盖时...
答案是什么? 1 或 2
我知道当我们重写超类中的方法时,方法签名应该是相同的。 但是遗产呢? 我在一本书上读过这个问题,但即使经过一些研究,我也没有找到任何答案。
从文档:
子类中的实例方法具有与超类中的实例方法相同的签名(名称,加上其参数的数量和类型)和返回类型,将覆盖超类的方法。
方法签名必须相同; 即名称、参数、参数位置、参数个数必须匹配。
最常见的例子是toString()
,它存在于Object
。 Object
的toString
方法定义如下:
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
东西,例如ArrayList
和LinkedList
。
扩展一点:方法在孩子中的可见性也起作用。
从这个方便的图表中,不能将具有private
修饰符的方法传递给子类。
覆盖方法时,不能降低方法的可见性; 也就是说,您不能按照提供的可见性顺序下降。
为了提供帮助,这里有一个快速列表。
如果您的父级中的方法是...
public
:子类的覆盖必须是public
。protected
:子类的覆盖可以是public
或protected
。<no modifier>
或包私有:子类的覆盖可以是public
、 protected
或 package-private 。private
:子类甚至不知道该方法存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.