【发布时间】:2012-05-21 01:52:25
【问题描述】:
我知道如何重载方法,以及如何重写方法。但是有可能同时重载和覆盖一个方法吗?如果有,请举个例子。
【问题讨论】:
标签: java overriding computer-science overloading
我知道如何重载方法,以及如何重写方法。但是有可能同时重载和覆盖一个方法吗?如果有,请举个例子。
【问题讨论】:
标签: java overriding computer-science overloading
重载和覆盖是互补的东西,重载是指方法名相同但参数不同,而覆盖是指子类中方法名相同但参数相同。因此,重载和覆盖不可能同时发生,因为重载意味着不同的参数。
例子:
class A {
public void doSth() { /// }
}
class B extends A {
public void doSth() { /* method overriden */ }
public void doSth(String b) { /* method overloaded */ }
}
干杯!
【讨论】:
重载和重载只是抽象。重载只是意味着编译器使用名称以及参数的类型和数量来确定要调用的函数。实际上,重载一个方法与给它命名不同,因为编译器用来查找函数的键是名称和参数列表的组合。
除了编译器可以使用 super 关键字来处理被覆盖的函数之外,覆盖的原理是相同的。
那么你能覆盖一个重载的函数吗?是的,因为重载方法在编译器眼中是完全不同的方法。
【讨论】:
final修饰符的子类中的重载方法中添加override注解,看看编译器是否决定参与
super 关键字。
这取决于你的意思。方法可以是超类中重载方法的覆盖。并且您可以重载一个您同时使用另一个方法覆盖的方法。
但是,您不能拥有一个既是 new 重载又是覆盖的方法。对于要成为覆盖的方法,具有相同签名的另一个方法必须已经存在于超类中......这意味着该方法不能是 new 覆盖。
【讨论】:
是的,这是可能的,你可以在同一个类中重载和覆盖一个函数,但你不能在两个不同的类中重载一个函数,因为这在逻辑上是不可能的。
#include <bits/stdc++.h>
using namespace std;
class Base {
public:
void print()
{
cout << "Base Function" << endl;
}
void print(string name) //Overloaded Function
{
cout << "Base Function : " <<name<< endl;
}
};
class Derived : public Base {
public:
void print()
{
cout << "Derived Function" << endl;
}
void print(string name) //Overloaded Function
{
cout << "Derived Function : "<<name<< endl;
}
};
int main() {
Derived derived1, derived2;
//accesses the print function in derived class
derived1.print();
//accesses the overloaded print function in derived class
derived1.print("Gitanshu");
//accesses the print function in base class
derived2.Base::print();
//accesses the overloaded print function in base class
derived2.Base::print("Gitanshu");
return 0;
}
输出:
Derived Function
Derived Function : Gitanshu
Base Function
Base Function : Gitanshu
我是用 C++ 回答的,Java 也一样。
【讨论】: