大家好,我是walker
一个从文科自学转行的程序员~
爱好编程,偶尔写写编程文章和生活
欢迎关注公众号【I am Walker】,一块学习编程~
方法的重载和重写都是实现多态的方式,
区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载
1、发生在同一个类中,
2、方法名相同
3、参数列表不同(参数类型不同、个数不同、顺序不同),
4、与方法返回值和访问修饰符无关,即重载的方法不能根据返回类型进行区分
与修饰符无关:
与返回值也无关:
重写
1、发生在父子类中,方法名、参数列表必须相同,
2、返回值小于等于父类,
案例:
- 父类
package objectOrientedTest.reloadAndOverride;
public class OverrideTest {
public String test(String name){
return "a";
}
public Object testReturn(){
return null;
}
}
- 子类
package objectOrientedTest.reloadAndOverride;
public class OverrideSon extends OverrideTest{
/**
* 父类的返回值的是String,这里将其修改成Object,就会报错
*/
@Override
public Object test(String name) {
return null;
}
/**
* 由于父类的返回值是Object,所以之而立可以将返回值修改成小于父类的String
*/
@Override
public String testReturn() {
return null;
}
}
报错原因:
3、抛出的异常小于等于父类,
案例:
- 父类
package objectOrientedTest.reloadAndOverride;
import java.io.IOException;
public class OverrideTest {
/**
* 错误案例
*/
public void errorExceptionTest() throws IOException {}
/**
* 正常案例
*/
public void rightExceptionTest() throws Exception{}
}
- 子类
package objectOrientedTest.reloadAndOverride;
import java.io.IOException;
public class OverrideSon extends OverrideTest{
/**
* 父类的异常为IOExeption,小于Exception,因此会报错
*/
@Override
public void errorExceptionTest() throws Exception {
}
/**
* 父类的异常为Exception,子类为IOException,小于父类的异常
*/
@Override
public void rightExceptionTest() throws IOException {
}
}
报错原因:
4、访问修饰符大于等于父类(里氏代换原则);
案例
- 父类
package objectOrientedTest.reloadAndOverride;
import java.io.IOException;
public class OverrideTest {
/**
* 错误案例
*/
void testDecorate(){}
/**
* 正确案例
*/
void rightDecorate(){}
}
- 子类
package objectOrientedTest.reloadAndOverride;
import java.io.IOException;
public class OverrideSon extends OverrideTest{
/**
* 父类修饰符是默认的default,子类为private,违反历史替换原则
*/
@Override
private void testDecorate() {
super.testDecorate();
}
/**
* 父类修饰符是默认的default,子类为public 大于父类
*/
@Override
public void rightDecorate() {
super.rightDecorate();
}
}
5、如果父类方法访问修饰符为private则子类中就不是重写。
因为private的话,只有本类有权限访问,因此没有重写这一说法了