重载
重载:即相同的作用域(同一类中),方法名相同,参数列表不同(参数个数或类型不同)。
重载规则
- 被重载的方法必须改变参数列表
- 被重载的方法可以改变返回类型
- 被重载的方法可以改变访问修饰符
- 被重载的方法可以声明新的或更广的检查异常
- 方法能够在同一类中或者子类中被重载
- 无法以返回值类型作为重载函数的区别标准
重载举例
最常用的重载就是构造方法中:有参构造方法和无参构造方法。
public class Animal {
public void eat(){
System.out.println("Animal eat");
}
public void eat(int times){//相同方法,参数数量不同
for (int i = 0;i < times; i++){
System.out.println("Animal eat "+(i+1)+" times");
}
}
public static void main(String[] args) {
Animal animal = new Animal();
animal.eat();
animal.eat(3);
}
}
重写
重写:子类对父类允许访问的方法的实现过程重新编写,返回值和形式都不能改变。相同方法名,相同参数列表
重写规则
- 参数列表与被重写方法的参数列表必须完全相同
- 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类
- 访问权限不能比父类中重写的方法的访问权限更低。
- 父类的成员方法只能被其子类重写
- 用final修饰的方法不能被重写
- 用static修饰的方法不能被重写,但是能够被再次声明
- 基类的abstract方法必须被派生类重写,否则派生类也必须是abstract
- 构造方法不能被重写
- 如果不能继承一个类,则不能重写该类的方法
重写举例
class Animal {
public void eat(){
System.out.println("Animal eat");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("Dog eat");
}
}
public class Test1{
public static void main(String[] args) {
Animal animal = new Animal();//Animal对象
Animal dog = new Dog();//Dog对象
animal.eat();
dog.eat();
}
}
运行结果:
重载与重写的区别
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 不能修改 |
返回值类型 | 可以修改 | 不能修改 |
异常 | 可以修改 | 可以减少或删除,不能抛出新的异常或更广的异常 |
访问权限 | 可以修改 | 方法的访问权限不能比父类低 |
总结
方法的重载和重写都是Java多态的不同表现,重写是父类与子类之间多态的一种表现,重载可以理解成多态的具体表现形式。
- 方法重载是一个类中定义了多个方法名相同,参数列表不同的的方法。
- 方法重写是子类方法与父类方法名字相同,参数列表也相同。
- 方法重载是一个类的多态表现,方法重写是子类与父类的多态表现。