如果我有在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类是添加在课堂上的过载 。 不覆盖 。 一个覆盖也只是不同的实现原始添加方法。
简单地说,是的。 要覆盖 ,您需要复制完整的方法签名,其中包括方法的名称,参数和返回类型。 从本教程
在具有相同签名(名称,再加上数量及其参数的类型)的子类的实例方法和返回类型的超类的实例方法覆盖超类的方法。
你可能要考虑@Override批注 ,这将引发编译错误,如果你没有成功overrride的方法。
在这种特定情况下,它也许看起来像你不需要覆盖这么多的一些解决方案,包括仿制药。 所以,你可以实例化一个类a<Integer>
和同级a<Float>
在这种情况下,你是不是覆盖方法,因为签名是不同的。
但超载在B级,因为你有两种方法具有相同的名称但不同的参数(如果其中一个类,而另一个在B级)
希望能帮助到你。
有可能是不被覆盖,但在子类重载的方法。 在这里,子类有两个的add()方法。 它接受INT参数的版本(未覆盖),和它接受float参数重载方法Add()。
我认为,在这种特殊情况下既不超载也不是压倒一切的发生,是因为返回类型必须是在超载的情况下压倒一切一样,所以没有静态绑定,也不动态绑定发生在这种情况下。 方法重载是不是在不同的返回类型的情况下有可能,因为编译器想不通,他需要调用哪个方法。
我知道这是迟到的回答,但我认为这是很重要的问题需要回答初学者。
在超载的一个关键点就是它在继承。
接下来要么是Static binding
或Dynamic binding
。
它是静态绑定 ,所以,为什么呢?
静态绑定
- 静态的Java绑定过程中发生
Compile time
。 -
private
, final
和static
方法和变量使用静态绑定,并通过编译器结合。 - 静态绑定使用类型(类在Java中)的绑定信息。
动态绑定
在动态绑定发生Runtime
。
动态方法基于运行时对象在运行期间接合。
动态绑定使用对象来解决约束力。
但重要的部分是在这里
重载方法是使用静态结合而覆盖的方法是使用动态运行时绑定粘结接合。
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);
但对于上面的代码,它会给编译时错误浮法参数。
希望它会清除所有的疑虑。
该方法add()
在A类也提供给B类通过继承,因此该方法被overloaded
通过从改变数据类型类int, int
到float, float
。
超载的概念来自于游戏,当且仅当函数是在同一个范围或类。 CZ如果这是方法重载然后为同样的方法签名或相同的参数类型,编译器变得迷惑,必须给编译时错误的情况下。 但在B类以上程序,如果你再根据超载就一定要把错误,但它是不会发生ü可以检查我已经有过相同的顺序相同的参数。 如果你调用任何方法,那么编译器会检查它的子类,如果它不存在,然后它会考虑父类,上面的程序是所有关于它继承通过对象引用其中的情况下。 希望这是有益的。
文章来源: Is this Overloading, methods with same name in different classes and different signature?