子类中的方法可以重载超类中的方法吗?

时间:2014-07-22 09:52:42

标签: java overloading

Java代码:

class P {
    public void hello() {}
}

class C extends P {
    public void hello(String s) {}
}

我的问题是:班级hello中的C是否超载了超类P中具有相同名称的{{1}}?

我的朋友说他们不是因为不在同一个班级。

12 个答案:

答案 0 :(得分:9)

采用更正式的方法,Java 7 Java语言规范指出:

  

如果一个类的两个方法(无论是在同一个类中声明,还是由一个类继承,或者一个是声明的,一个是继承的)都具有相同的名称,但签名不是覆盖等价的,那么方法名称是据说超载了。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.9

我会指出你朋友的这个链接。

因此,简而言之,在您的示例中,hello方法确实已经过载。

答案 1 :(得分:6)

简单说明:

我认为这个问题的出现是因为我们有时会听到以下内容,

方法重载在类中执行。 方法重写发生在具有继承关系的两个类中。

以上陈述是正确的。但你的朋友错了。为什么呢?

因为当你扩展一个类时,子类具有超类定义的所有方法。 好像所有超类的方法都已由子类实现。这意味着hello()方法也已由类C实现。现在,您在C类中添加了一个具有不同参数的方法(hello(String s))。这意味着,C类有两种方法,它们具有相同的名称但参数不同,并且是“重载”。

希望它非常清楚。

答案 2 :(得分:1)

是的,你的朋友错了,因为他只考虑覆盖的概念。

但是这里的hello()hello(String s)因参数而异,因此重载不会覆盖。

答案 3 :(得分:0)

长话短说,C的实例将同时提供hello()hello(String s)方法。 P的实例只能使用hello方法。

这确实是重载,因为你有两个同名的方法使用不同的参数。

但是,它不是覆盖,因为覆盖是在子类中声明的方法,其名称与相同,参数与超类中的方法相同。

E.g。如果你有

class C extends P {
    public void hello() {}
}

它将覆盖 hello()中声明的P方法。在这种情况下调用new C().hello()时,您将调用类hello()中声明的C方法的实现。

答案 4 :(得分:0)

Yes it is overloading,如果课程“C”正在扩展P并因此two methods with the same nam e但different parameters导致在hello()中重载方法Class C。但是Class P只能访问其自己定义中存在的方法之一。

答案 5 :(得分:0)

这是一个有效的问题,因为通常,在同一个类中使用两个具有相同名称(但不同参数)的方法来解释重载。

我认为是的,hello中的方法C正在超载P的{​​{1}}方法,因为"是" 34;关系。

"是"关系表明,由于C子类P,它也是P的实例(" C P")。因此C有2个重载hello - 方法。

答案 6 :(得分:0)

重载可能发生在同一个类以及父子类关系中,而重写只发生在继承关系中。

答案 7 :(得分:0)

好问题!!!在子类中如果方法名称|参数类型|列表被更改,然后子类方法将不被视为重写它被视为重载方法 示例:

class A{
void m1(int a){}
}

class B extends A{
  void m1(float f)
   {}
}

在上面的程序中,m1方法是一种重载方法。

答案 8 :(得分:0)

是的,我们可以像下面这样重载子类中的超类方法:

 node:
    container_name: node
    build:
      context: .
      dockerfile: ./docker/node/development/Dockerfile
    ports:
      - "3000:3000"
    volumes:
      - .:/code
      - /code/client/app/node_modules/
    command: npm run start
    environment:
      - REACT_EDITOR=atom

答案 9 :(得分:0)

混乱的根源:如果您谈论C ++而不是Java,那么您的朋友将是正确的。在C ++中,函数重载只能发生在同一类的成员之间。而在Java中,除此之外,跨具有继承关系的两个类还会发生重载。

答案 10 :(得分:0)

取决于类。从类P的角度来看(如果引用是P,则对象可以是C),不是。如果您编写类似以下内容的内容:P p = new C();,则不会发生重载,因为您无法调用p.hello("foo")

从类C的角度来看,它是重载的,因为如果您编写C c = new C();,则它有两个具有相同名称和不同签名的方法。

答案 11 :(得分:-1)

重载是指两种方法具有相同的名称但签名不同(您的情况)。

附注:覆盖是指两个方法完全相同的签名和名称以及父类。