定义
方法重载(OverLoad)
发生在同一个类中,方法名必须相同,参数类型、个数、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
方法重写(Override)
发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类。访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类不能重写该方法。
加深理解
方法重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不会改变。壳不变,方法体重写。
重写的好处在于子类可以根据自己的需要,定义自己的行为(方法体),也就是说子类能够根据自己的需要实现父类的方法。
方法重写例子
import java.io.IOException;
public class Override_OverLoad {
public static void main(String[] args) throws Exception {
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.eat();// 执行 Animal 类的方法
b.eat();//执行 Dog 类的方法
}
}
class Animal {
public void eat() throws Exception{
System.out.println("动物吃东西");
}
private void move(){
System.out.println("动物奔跑");
}
}
class Dog extends Animal {
//子类抛出的异常必须小于等于父类抛出的异常
//IOException是Exception的子类,当然这个地方不需要抛出异常,仅仅是为了举例。
@Override
public void eat() throws IOException {
System.out.println("狗吃xx");
}
//父类private修饰的方法不能重写
/*@Override
public void move(){
System.out.println("狗xxx");
}*/
}
控制台输出
动物吃东西
狗吃xx
方法重写的原则
- 参数列表与被重写方法的参数列表必须完全相同;
- 返回类型与重写方法的返回类型可以不相同,但是必须是父类返回值的派生系(java7及更高版本规定);
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么子类中重写该方法就不能声明为protested;
- 父类的成员方法只能被它的子类重写;
- 声明为final的方法不能被重写;
- 声明为static的方法不能被重写,但是能够再次声明;
- 子类和父类在同一个包中,那么子类可以重写父类所有的方法,除了声明为private和final的方法;
- 子类和父类不在同一个包中,那么子类只能重写父类的声明为public和protected的非final方法;
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以;
10.构造方法不能被重写;
11.如果不能继承一个类,则不能重写该方法。
方法重写中super的用法
当子类调用父类被重写的原有方法时,可以通过super调用
public class Super {
public static void main(String[] args) {
Teacher teacher=new Teacher();
teacher.teach();
}
}
class People{
public void study(){
System.out.println("人都具备学习的能力");
}
}
class Teacher extends People {
public void teach (){
super.study(); // 应用super类的方法
System.out.println("老师教书");
}
}
控制台输出
人都具备学习的能力
老师教书
方法重载
每个重载的方法都必须有一个独一无二的参数类型列表
方法重载的规则
- 重载的方法必须改变参数列表(参数个数或类型不一样);
- 重载的方法可以改变访问类型;
- 重载的方法可以改变访问修饰符;
- 重载的方法可以声明新的或者更广的检查异常;
- 方法能够在同一个类或者一个子类中被重载;
方法重载的例子
public class OverLoad {
public static void main(String[] args) {
OverLoad o = new OverLoad();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1, "test3"));
System.out.println(o.test("test4", 1));
}
public int test() {
System.out.println("test1");
return 1;
}
private void test(int a) {
System.out.println("test2");
}
//以下两个参数类型顺序不同
public String test(int a, String s) {
System.out.println("test3");
return "returntest3";
}
public String test(String s, int a) {
System.out.println("test4");
return "returntest4";
}
}
控制台输出
test1
1
test2
test3
returntest3
test4
returntest4
问题
方法重写是java多态的一种体现运行时的多态,那方法重载呢?
如有错误,欢迎指正
文章参考地址:https://www.runoob.com/java/java-override-overload.html