2013-03-08 62 views
8

如果我有在Java中,下面的代码:这是重载,在不同的类和不同的签名具有相同名称的方法?

class A { 

    public int add(int a , int b) { 
     return (a+b); 
    } 
} 

class B extends A { 
    public float add(float a , float b) { 
     return (a+b); 
} 

在子类是不完全重写基类的add功能,因为它们有不同的签名和发生超载的概念只有在这种特殊情况下,他们在相同的范围内。那么,子类B中的函数add(float , float)是否被视为一个全新的函数,并且重载和覆盖的概念不适用于它?它使用“静态绑定”还是“动态绑定”?

+2

只是一个提示:Java中的类名应该以大写字母开头。 – 2013-03-08 10:10:39

+0

我不认为这是强制性的.. – 2013-03-08 10:13:23

+0

这不是强制性的,但它有助于可读性等 – 2013-03-08 10:14:13

回答

2

简单地说,是的。要覆盖,您需要复制完整的方法签名,其中包括方法名称,参数和返回类型。从the tutorial

在具有相同签名(名称,加上 数量及其参数的类型)的子类的实例方法,并作为超的 实例方法重写父类的方法返回类型。

您可能想要考虑@Override annotation,如果您未成功覆盖方法,将触发编译器错误。

在这种特定情况下,它也许看起来像你不需要覆盖这么多的一些解决方案,包括仿制药。所以,你可以实例化一个类a<Integer>和同级a<Float>

+0

所以你在说b中的add(float,float)是一个完全不同的函数,并且与class a中的add函数没有任何关系。在这种情况下,超载也不会超越。 – 2013-03-08 10:23:20

+0

也许吧。你不是压倒性的,你提供了一个不同的类,其中有一个重载的方法和原来的一样,所以在这里更适合使用泛型解决方案。 – 2013-03-08 10:58:30

4

方法B类补充说明的是加在课堂上的超载。不是覆盖。重写只是原始添加方法的不同实现。

+0

但是我知道Overloading的概念只有当函数是在相同的范围或类别中。这就是造成混淆的原因 – 2013-03-08 10:18:44

2

在这种情况下,您不是覆盖该方法,因为签名是不同的。

但有超载在B级,因为你有两种方法具有相同的名称但不同的参数(如果其中一个类,而另一个在B级)

希望它能帮助。

+0

但是我知道只有当函数处于相同的范围或类中时,Overloading的概念才起作用。这是造成混乱的原因。 – 2013-03-08 10:17:49

1

可以有未覆盖,但在子类重载的方法。这里的子类有两个add()方法。接受int参数(未重写)的版本和接受float参数的重载方法add()。

-1

在类A中的方法add()也通过继承提供给类B,因此该方法通过改变数据类型从int, intfloat, float类是overloaded

+0

我想这并不能真正回答这个问题。提问者知道超载和重写。 – 2015-09-11 16:32:01

0

我认为在这种特殊情况下既不超载也不是压倒一切的发生,是因为返回类型必须是在超载的情况下压倒一切一样,所以没有静态绑定,也不动态绑定发生在这种情况下。 在不同的返回类型的情况下,方法重载是不可能的,因为编译器无法确定他需要调用哪种方法。

-1

超载的概念来自于游戏,当且仅当函数是在同一个范围或类。 cz如果这是方法重载的情况,那么对于相同的方法签名或相同的参数类型,编译器会感到困惑,并且必须给出编译时错误。 但在上面的B类程序中,如果你按照相同的顺序传递相同的参数,那么根据重载它必须给出错误,但它不会发生,你可以检查它,我已经有了。 这是继承的情况,通过对象引用,如果你调用任何方法,那么编译器会在子类中检查它,如果它不存在,那么它会查看父类,以上程序是关于。 希望这是有帮助的。

+0

请处理大小写和标点符号。这个答案很难理解 – lwassink 2016-07-13 18:42:10

相关问题