Java学习日志-重载和重写的区别
本文为个人学习总结,如有内容错误,请积极指出,本人一定虚心接受。
一、概念
- 重载:我们可以在同一个类中声明多个方法名相同形参列表不同的方法,这些彼此之间构成重载,构造器之间也可以重载。
- 重写:父类继承子类以后,可以对父类中同名同参数的方法进行覆盖操作。
二、规则的区别
- 重载:
(1) 满足“两同一不同”,“两同”:同一个类中;方法名相同。
(2)“一不同”:参数列表不同(具体表现为参数列表的类型、个数、顺序不同。) - 重写:
(1)子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同。
(2)子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符(特殊情况:子类不能重写父类中声明为private权限的方法。)
(3)返回值类型要求如下:父类被重写的方法的返回值类型为void,则子类重写的方法的返回值类型也只能是void;父类被重写的方法的返回值类型是A类型,则子类重写方法的返回值类型可以是A类型或者A类型的子类;父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double)。
(4)子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常值类型。
三、从编译和运行的角度进行区别
- 重载:不表现为多态性。在编译时编译器根据方法不同的参数列表,对同名方法的名称做修饰。对于编译器而言,这些同名的方法就成了不同的方法。它们的调用地址在编译期就绑定了,这称为“静态绑定”。
- 重写:表现为多态性。只有等到方法调用的那一刻,解释运行器才会确定所需调用的具体方法,这称为“静态绑定”。
四、代码展示
重载的代码展示
.
// 以下4种方法构成重载
public void getSum(int i,int j){
System.out.println(i+j);
}
public void getSum(double i,double j){
System.out.println(i+j);
}
public void getSum(String i,double j){
System.out.println(i+j);
}
public void getSum(double j,String i){
System.out.println(i+j);
}
// 注意:以下方法和第一种方法并不构成重载
public void getSum(int m,int n){
System.out.println(i+j);
}
重写的代码展示
.
// 以下为方法的重写
public class Person {
int age;//年龄
String name;//姓名
public void eat(){
System.out.println("每个人都要吃饭!");
}
public void walk(){
System.out.println("每个人都应该积极锻炼!");
}
}
public class Student extends Person{ //Student类继承Person类
int number;//学生学号
public void eat(){ //eat()方法的重写
System.out.println("学生应该多吃有营养的食物!");
}
public void walk(){ //walk()方法的重写
System.out.println("学生应该积极锻炼!");
}
}