Java代码:
class P {
public void hello() {}
}
class C extends P {
public void hello(String s) {}
}
我的问题是:班级hello
中的C
是否超载了超类P
中具有相同名称的{{1}}?
我的朋友说他们不是因为不在同一个班级。
答案 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)
重载是指两种方法具有相同的名称但签名不同(您的情况)。
附注:覆盖是指两个方法完全相同的签名和名称以及父类。