1.概述:在java中,面向对象的三大特征中的多态主要由方法重写和方法重载以及向上或向下转型实现,接下来,就让我们了解一下方法的重写和重载。
2.方法重写
方法的重写是发生在继承或实现的关系中,由子类重写父类的方法或实现类重写接口的方法,其构造方法和被final/private/static关键字修饰的方法不能被重写,方法重写中方法名和参数列表必须和父类方法的一致可以加上@Override注解检查重写是否规范。
Person类(父类):
public class Person {
public void run() {
System.out.println("Person run...");
}
}
Studnet类(子类):
public class Student extends Person {
@Override
public void run() {
System.out.println("Student run...");
}
}
在以上的两个类中,Person类为父类并定义了run方法,Student类继承自Person类并且对父类中的run方法进行了重写,下面创建一个测试类
public class Test {
public static void main(String[] args) {
Person per=new Student();
per.run();
}
}
测试结果:
从测试结果中可以看出,实际运行中执行的方法为子类中重写的方法,所以方法重写是发生在运行期
方法重写的特点:
1.方法重写发生在运行期
2.方法名和参数列表必须和父类的一致
3.方法的修饰符大于等于父类方法的修饰符,返回值和抛出异常类型小于等于父类方法的异常类型
4.构造方法和被final/private/static关键字修饰的方法不能被重写
3.方法重载
方法重载是发生在同一个类中,方法名相同,根据不同的传参,内部逻辑不同,不同的传参指参数类型不同,参数顺序不同和参数个数不同,与访问修饰符无关,其构造方法可以被重载。
Student类:
public class Student extends Person {
@Override
public void run() {
System.out.println("Student run...");
}
public void shout(String name) {
System.out.println(name+"大喊");
}
public void shout(int num) {
System.out.println(num+"个学生大喊");
}
public void shout(String sex,int num) {
System.out.printf("%d个%s大喊",num,sex);
}
public void shout(int num,String place) {
System.out.printf("%d个同学在%s大喊",num,place);
}
}
在上面的Student类中添加4个方法名全为shout的方法,由于传参的不同形成了重载,并没有报错,一个类中是不能出现方法名和参数列表都一致的两个方法。
测试类:
public class Test {
public static void main(String[] args) {
Student stu=new Student();
stu.shout(4);
stu.shout("张三");
stu.shout(5, "教室");
stu.shout("女生", 3);
}
}
测试结果:
从测试结果中看到,程序会根据我们不同的传参来执行不同的方法,但是方法重载不是发生在运行期,
而是发生在编译期。
方法重载的特点
1.发生范围在同一个类中
2.发生在编译期
3.方法名一致,参数列表必须不一致(参数类型不同,参数顺序不同,参数个数不同)
4.与返回值和访问修饰符无关
5.构造方法可以被重载
4.方法重写与方法重载的区别
1.方法重写是对父类的方法进行重新实现,方法重载是根据传参的不同,内部的实现逻辑也就不同
2.发生范围不同:重写发生在父类与子类之间,重载发生在同一个类中
3.发生时间不同:重写发生在运行期,重载发生在编译期
4.构造方法可以被重载,但不能被重写
5.方法重载与返回值和访问修饰符无关,方法重写的访问修饰符大于等于父类方法,返回值小于等于。