重载:重载是发生在同一个类中,方法名称相同,方法参数不同。在调用时,程序会根据方法的传参找到相对应的方法。
public void change(Integer a){
a+=1;
}
public void change(Integer a,Integer b){
a=b+1;
}
这里返回值类型和访问修饰符不同不是重载。重载只和参数相关。
//编译器会报错
public void change(Integer a){
a+=1;
}
public String change(Integer a){
a+=1;
return "aaa";
}
//编译器会报错
public void change(Integer a){
a+=1;
}
private void change(Integer a){
a+=1;
}
重写:重写是发生在父子类中,子类通过重写覆盖父类的非static非final方法。有以下四点要求:
1.子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表。
2.子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型。具体可细分为三种情况:
⑴父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void。
⑵父类被重写的方法的返回值是A类型,则子类重写的方法的返回值类型可以是A类型或A类型的子类。
⑶父类被重写的方法的返回值是基本类型,则子类重写的方法的返回值类型必须是相同的基本数据类型。情况 ⑵包含该条,该条做强调说明。
//父类返回object类型,子类返回string类型
class Parent {
public Object method1() {
return new Object();
}
}
class Child extends Parent {
public String method1() {
return new String();
}
}
3.子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限,同时子类不能重写父类中声明为private权限的方法。
4.子类方法抛出的异常不能大于父类被重写方法的异常。
请看以下具体实例:
1.该例子不满足上述条件3。
//错误实例,子类的访问权限小于父类
class Parent {
public void method1() {}
}
class Child extends Parent {
private void method1() {}
}
2.该例子不满如上述条件4。
//子类抛出的异常大于父类抛出的异常,编译器回报错
class Parent {
public Object method1() throws RuntimeException {
return new Object();
}
}
class Child extends Parent {
public String method1() throws Exception{
return new String();
}
}