多态性

  1. 静态多态:也称为编译期间的多态,编译器在编译期间完成的,主要通过函数重载实现。编译器根据相同函数名的不同参数列表,可推断出要调用哪个函数。
public class Person {
    public void say(){
        System.out.println("我是第一个名为say的方法!");
    }
    public void say(int n){
        System.out.println("我是第二个名为say的方法!!");
    }
}
//测试
public class Main {
    public static void main(String[] args) {
        Person p1=new Person();
        p1.say();//我是第一个名为say的方法!
        p1.say(4);//我是第二个名为say的方法!    
    }
}
  1. 动态多态(动态绑定):即运行时的多态,在程序执行期间判断所引用对象的实际类型,根据其实际类型调用相应的普通方法(因为我们在继承性中说到,参数和静态方法是静态绑定的)
//父类
public class Person {
    public void say(){
        System.out.println("我是一个人!");
    }
}
//子类1
public class Student extends Person{
    public void say(){
        System.out.println("我是一名学生!");
    }
}
//子类2
public class Worker extends Person{
    public void say(){
        System.out.println("我是一名工人!");
    }
}
//测试
public class Main {
    public static void main(String[] args) {
        Person p1=new Student();//编译时即静态时系统只知道p1为Person类型,但运行时即动态时系统判断出p1的实际类型为Student,并根据实际类型调用相应的普通方法
        Person p2=new Worker();//编译时即静态时系统只知道p2为Person类型,但运行时即动态时系统判断出p2的实际类型为Worker,并根据实际类型调用相应的普通方法
        p1.say();//我是一名学生!
        p2.say();//我是一名工人!
    }
}