下面的例子展现了方法重载和重写的区别:
package com.xs;
/**
* 重载和重写
*
* @author Administrator
*
*/
public class OverLoadAndOverrideTest extends Service {
/**
* 方法重写
*/
@Override
public void request(RequestParamsA paramsA) {
System.out.println("方法重写");
}
/**
* 方法重载,不能加Override注解
*
* @param hashMap
*/
public void request(RequestParamsB paramsB) {
System.out.println("方法重载");
}
/**
* @param args
*/
public static void main(String[] args) {
OverLoadAndOverrideTest service = new OverLoadAndOverrideTest();
service.request(new RequestParamsA());
service.request(new RequestParamsB());
}
}
class RequestParamsA {
}
class RequestParamsB extends RequestParamsA {
}
class Service {
public void request(RequestParamsA paramsA) {
}
}
输出:
方法重写
方法重载
注:以上的设计实际上违背了里氏替换原则。根据里氏替换原则,子类重载父类的方法时,子类的前置条件(输入参数)应该比父类更宽松,以保证父类的重载方法优先被调用。这里为了演示方便就不深究了。
如果将重载的方法删掉,程序仍能执行,但输出结果如下:
方法重写
方法重写