重载(overload):
在一个类中,同名的方法如果有不同的参数列表(参数类型不同,参数个数不同,参数顺序不同)则视为重载。同时重载对返回类型没有要求,可以相同也可以不同。
重载是一个类中多态性的一种表现,Java中的重载就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数列表(参数类型,参数个数,参数顺序)。调用方法时,通过传递给它们的不同参数列表来决定具体使用哪个方法。
public class Student {
private String name;
private int age;
private String stuID;
public Student(){
}
public Student(String name){
this.name=name;
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public Student(String name,int age,String stuID){
this(name, age);
this.stuID=stuID;
}
public static void main(String [] args){
Student stu1=new Student();
Student stu2=new Student("张三");
Student stu3=new Student("李四",17);
Student stu4=new Student("王五",34,"a3939345");
}
}
在上述代码中,Student类中的四个构造函数就是方法的重载(方法名相同,参数列表不同)。在新建对象时,即调用构造方法时,通过判断不同的参数列表,来决定调用哪一个构造方法。
重写(overload):
重写是父类与子类之间的多态性,实质是子类对父类的方法进行重新定义。如果在子类中定义的方法与其父类的方法具有相同的方法名和参数列表,即构成重写。即外壳不变,核心重写!
eg:儿子继承了父亲的中餐馆
A:我还想做中餐------------------------------------不需要重写
B:我想改做西餐------------------------------------需要重写
C:我想在中餐之上加入西餐---------------------需要重写(super中餐,再加入西餐)
重写需要遵循的原则:“两同两小一大”
“两同”:方法名相同,参数列表相同
“两小”:子类方法的返回值类型小于等于父类方法的返回值类型
(void和基本数据类型时,必须相等;引用数据类型时,小于或等于,其中父类大,子类小)
子类方法抛出的异常小于等于父类方法抛出的异常
“一大”:子类方法的访问权限大于或等于父类方法的访问权限
总结:
重载(overload):“一同一异,其他随意”-------->方法名相同,参数列表不同,其他随意。
重写(override):“两同两小一大”------->方法名相同,参数列表相同;返回值类型和抛出异常要小于等于;访问权限要大于等于
重载与重写是Java多态性的不同表现:
重载是一个类中的多态性表现,遵循“编译期绑定”,在编译时,根据不同参数列表调用方法。(静态多态性)
重写是父类与子类的多态性表现,遵循“运行期绑定”,在运行时,根据不同对象类型调用方法。(动态多态性)
Java程序的执行分为两个时期:编译期和运行期
编译期:.java源文件,经过编译,生成.class字节码文件。
运行期:JVM加载.class字节码文件并运行。
面试问题:重载(overload)和重写(override)的区别?
答:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。