这是重载,方法在不同的类和不同的签名中具有相同的名称吗?

时间:2013-03-08 10:07:19

标签: java oop overloading

如果我在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函数,因为它们具有不同的签名,并且仅当它们在同一范围内时才会发生重载的概念。那么,子类add(float , float)中的函数B是否被视为一个全新的函数,并且重载和覆盖的概念不适用于它?它是否使用“静态绑定”或“动态绑定”?

8 个答案:

答案 0 :(得分:4)

类b中的方法添加是类a中添加的重载。不是覆盖。覆盖只是原始add方法的不同实现。

答案 1 :(得分:2)

简而言之,是的。要覆盖,您需要复制完整的方法签名,其中包括方法名称,参数和返回类型。来自the tutorial

  

具有相同签名的子类中的实例方法(name,plus   它的参数的数量和类型)和返回类型   超类中的instance方法会覆盖超类的方法。

您可能需要考虑@Override annotation,如果您未成功覆盖某个方法,则会触发编译器错误。

在这个特定的例子中,它可能看起来像你不需要覆盖一些解决方案,包括泛型。因此,您可以实例化一个类a<Integer>和一个类似的类a<Float>

答案 2 :(得分:2)

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

但是b类中有重载,因为你有两个方法具有相同的名称但参数不同(一个是a类,另一个是b类)

希望它有所帮助。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我认为在这种特殊情况下,既不会发生重载也不会发生重写,因为在重载和覆盖的情况下返回类型必须相同,因此在这种情况下既不会发生静态绑定也不会发生动态绑定。 如果返回类型不同,则无法进行方法重载,因为编译器无法确定需要调用哪种方法。

答案 5 :(得分:0)

我知道答案很晚,但是我认为这是一个对于初学者来说必须回答的重要问题。

重载的一个关键点是它可以继承。

下一步是Static bindingDynamic binding

这是静态绑定那么,为什么?

静态绑定

  1. Java中的静态绑定在Compile time期间发生。
  2. privatefinalstatic方法和变量使用静态绑定并由编译器绑定。
  3. 静态绑定使用类型(Java中的类)信息进行绑定。

动态绑定

  1. 动态绑定在Runtime期间发生。

  2. 在运行时基于运行时对象绑定的动态方法。

  3. 动态绑定使用对象来解析绑定。

但是重要的部分在这里

  

在运行时使用静态绑定来绑定重载方法,而在运行时使用动态绑定来绑定重载方法。

Java编译器根据用于调用方法的参数类型来确定要在编译时执行的重载方法的正确版本,这两个类的重载方法的参数都会接收在调用中使用的参数的值并执行重载方法。

B a=new B();
a.add(4, 5);
a.add(4.0f, 5.0f);

因此,如果您将创建类型B的引用,则它将搜索正确的参数类型 对于上述代码,它将执行这两种方法。

A a=new B();
a.add(4, 5);
a.add(4.0f, 5.0f);

但是对于上面的代码,它将为float参数给出编译时错误。

希望它消除了所有疑问。

答案 6 :(得分:-1)

A类中的方法add()也可以通过继承用于B类,因此通过将数据类型从overloaded更改为int, int,该方法在类中为float, float

答案 7 :(得分:-1)

当且仅当函数在同一范围或类中时,重载的概念才起作用。 cz如果这是方法重载的情况,那么对于相同的方法签名或相同的参数类型,编译器会混淆并且必须给出编译时错误。 但是在B类的上述程序中,如果你以相同的顺序传递相同的参数,那么根据重载,它必须给出错误,但它不会发生你可以检查它我已经拥有。 这是继承的情况,如果你通过对象引用调用任何方法,那么编译器将在子类中检查它,如果它不在那里,那么它将查看上述程序所关注的父类。 希望这是有帮助的。