Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这是重载吗?不同类中具有相同名称和不同签名的方法?_Java_Oop_Overloading - Fatal编程技术网

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

Java 这是重载吗?不同类中具有相同名称和不同签名的方法?,java,oop,overloading,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函数,因为它们具有不同的签名,并且只有当它们在同一范围内时才会出现重载的概念。那么,子类B中的

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

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

子类中具有相同签名(名称加 参数的编号和类型)和返回类型作为 超类中的实例方法覆盖超类的方法

您可能需要考虑,如果没有成功重写方法,将触发编译器错误。


在这个特定的实例中,看起来您不需要太多重写,只需要一些包含泛型的解决方案。因此,您可以实例化一个类
a
,类似的类
a

方法类b中的外接程序是类a中的一个重载。不是一个覆盖。重写只是原始add方法的不同实现。

在这种情况下,由于签名不同,您没有重写该方法

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


希望有帮助。

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

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

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

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

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

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

接下来是
静态绑定
动态绑定

它是静态绑定那么,为什么呢

静态绑定

  • Java中的静态绑定在编译时发生
  • private
    final
    static
    方法和变量使用静态绑定并由编译器绑定
  • 静态绑定使用类型(Java中的类)信息进行绑定
  • 动态绑定

  • 动态绑定在运行时发生

  • 基于运行时对象在运行时绑定的动态方法

  • 动态绑定使用对象来解析绑定

  • 但重要的部分就在这里

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

    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);
    
    但对于上面的代码,它将给出浮点参数的编译时错误


    希望它能消除所有疑问。

    只是一个提示:Java中的类名应该以大写字母开头。我不认为它是强制性的。它不是强制性的,但它有助于可读性等。这就是我为什么写“应该”。是的,没错。谢谢你的编辑。但是我知道重载的概念在函数在同一个作用域或类中时才起作用。这就是造成混淆的原因。但我知道重载的概念在函数位于同一作用域或类时才起作用。这就是造成混淆的原因,所以你说类b中的add(float,float)是一个完全不同的函数,与类a中的add函数没有任何关系。在这种情况下,重载和重写在这里起作用。你没有重写,你提供了一个不同的类,在原始类的旁边有一个重载方法,所以我认为泛型解决方案在这里更合适,它不能真正回答这个问题。询问者知道重载和重写。请使用大写