2015-06-15 40 views
-3

当在Java中预定义的方法被覆盖......在Java中重写方法时会发生什么?

  1. 只有方法签名必须是同一
  2. 两个方法签名和继承必须是同一

答案是什么? 1或2

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

+3

'方法签名和继承必须相同'请解释。 – Saif

+0

[覆盖和隐藏方法](https://docs.oracle.com/javase/tutorial/java/IandI/override.html) – MadProgrammer

+0

@Saif我在书中读到这个。我也有同样的疑问。如果你有任何想法发布你的问题 –

回答

1

From the docs

在具有相同签名(名称,加上数量和它的参数的类型)的子类的实例的方法和如在超类中的实例方法重写父类的方法返回类型。

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

这最常见的例子是toString(),它生活在ObjectObjecttoString方法被定义为这样的:

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


要扩展位:在孩子的方法的知名度也起到了重要作用。

从此handy chart,具有private修饰符的方法不能传递给子类。

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

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

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

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

我想这里的继承可能是指在预定义的超类中提到的访问说明符。如果我们扩展该类并尝试重写该方法,则不允许通过放置公共访问说明符(让超类方法具有私有性)来增加访问权限。在这种情况下,继承词是指它吗?如果是这样的话,我的问题就明确了! –

+0

我认为你在这里得到了可见性,但我会修改我的答案。 – Makoto

相关问题