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

如果我在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被视为一个全新的函数,并且重载和重写的概念不适用于它吗? 它是否使用“静态绑定”或“动态绑定”?

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

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

子类中具有相同签名(名称,加上其参数的数量和类型)和返回类型作为超类中的实例方法的实例方法会覆盖超类的方法。

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

在这个特定的例子中,它可能看起来像你不需要覆盖一些解决方案,包括generics。 所以你可以实例化一个类a和一个类似的类a

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

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

希望能帮助到你。

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

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

我知道这是迟到的答案,但我认为重要的问题需要为初学者解答。

重载的一个关键点是它在inheritance中起作用。

接下来是Static bindingDynamic binding

这是静态绑定所以,为什么?

静态绑定

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

动态绑定

  1. 动态绑定在Runtime发生。

  2. 动态方法在运行时根据运行时对象绑定。

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

但重要的是这里

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

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参数提供编译时错误。

希望它能解决所有疑虑。

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

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