日期:2014-05-20  浏览次数:20665 次

方法的重载 和方法的重新定义有什么区别?
方法的重载   和方法的重新定义有什么区别?

例如静态方法不能被重写,但可以重新定义。   不理解?

------解决方案--------------------
楼主提到了三个概念:重载、重写、重新定义。

重载是指同一个类中的两个函数函数名一样,但参数列表不一样(或者再加上返回值),比如String的substring(int beginIndex)和substring(int beginIndex, int endIndex)。

重写(Override)是指子类与父类的方法头部完全一样(或者叫签名,Signature),又翻译成覆盖、覆写。它的作用是为了实现多态。

重新定义是用于static方法,跟重写类似,子类和父类的方法头完全一样,子类的方法隐藏了父类的方法。与前者的区别可见下例:

class A {
public void f() {}
public void f(int i) {}
public static g() {}
};

class B extends A {
public void f() {}
public static g() {}
};

f是非静态的,g是静态的。
类A中的两个f叫重载,B中的f重写了父类无参数的那个f,而B中的g重新定义了A中的g。

若有代码:
A a;
B b;

a = new A();
a.f(); //执行A中的f
a.g(); //执行A中的g

a = new B();
a.f(); //执行B中的f -- 属于多态,虽然a是A类型的引用,
//但a指向的是B的实例,会调用真正实例的函数
a.g(); //执行A中的g,因为a是A类型的

b = new B();
b.f(); //执行B中的f
b.g(); //执行B中的g
((A)b).g(); //执行A中的g,因为b向上转型为A类型了
------解决方案--------------------
brooksychen(初晨之阳)已经解释的很清楚了,LZ结帖吧
------解决方案--------------------
重载是发生在一个作用域内。比如同一个类的可以有几个名称相同的方法,但参数列表不同。
重写发生在继承关系中。如子类也有与父类的完全相同的方法原形,但实现却不一样。