在Java中重载和重写

时间:2012-05-13 01:55:58

标签: java override computer-science overloading

我知道如何重载方法,以及如何覆盖方法。但是,是否可以同时重载和覆盖方法?如果是,请举个例子。

4 个答案:

答案 0 :(得分:16)

重载和重写是互补的,重载意味着相同的方法名称但不同的参数,并且重写意味着具有相同参数的子类中的相同方法名称。因此,不可能同时发生重载和覆盖,因为重载意味着不同的参数。

示例:

class A {
    public void doSth() { /// }
}

class B extends A {
    public void doSth() { /* method overriden */ }

    public void doSth(String b) { /* method overloaded */ }

}

干杯!

答案 1 :(得分:5)

重载和重载只是抽象。重载只是意味着编译器将名称与参数的类型和数量结合使用来寻址要调用的函数。实际上,重载方法与命名它不同,因为编译器用来查找函数的键是名称和参数列表的组合。

覆盖是一种相同的原则,除了编译器可以使用super关键字解决覆盖函数。

那么你可以覆盖重载函数吗?是的,因为重载方法在编译器眼中是完全不同的方法。

答案 2 :(得分:1)

这取决于你的意思。方法可以是超类中重载方法的覆盖。并且您可以使用其他方法重载一个同时覆盖的方法。

但是,您不能拥有一个同时具有 new 重载和覆盖的方法。对于要成为覆盖的方法,具有相同签名的另一个方法必须已经存在于超类中......这意味着此方法不能是 new 覆盖。

答案 3 :(得分:0)

是的,这是可能的,您可以重载和覆盖同一类中的函数,但不能重载两个不同类中的函数,因为这在逻辑上是不可能的。

#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。