多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作作用在不同对象时,会有不同的语义,从而产生不同的结果。
多态的两种表现方法:
一、方法的重载(overload)。重载是指同一个类中许多个同名方法,但这些方法有着不同的参数,因此在编译时就可以选择确定到底调用哪个方法,它是一种编译时多态,重载可以被看成一个类方法中多态性。
二、方法的重写(override)子类可以覆盖父类的方法,因此同名的方法会在父类和子类有着不同的表现形式。
在Java中,父类的引用变量可以指向父类的实例,也可以指向子类的实例,同理,接口的引用也可以指向它实现类的实例对象。程序调用的方法在运行时才动态绑定,动态绑定指的是一个方法的调用和一个方法的主体连接在一起,就是引用变量所指向的具体实例方法,也就是内存正在运行那个方法,而不是引用变量的类型中定义法人方法。通过这种动态绑定的方法实现了多态。由于只是运行时才能确定调用哪个方法,因此通过方法重写实现的多态成为运行时多态。
重载实现多态性示例:
public class Parents {
public void method(){
System.out.println("我是无参数的方法");
}
public void method(String name){
System.out.println("我是有参数的方法");
}
}
public static void main(String[] args) {
Parents p1=new Parents();
p1.method();
p1.method("小明");
}
}
由上面的例子可以看出我们在编译时就可以选择执行哪个方法,可以根据自己的需求选择有参数的方法还是无参数的方法。
重写实现多态性示例(为了方便演示我把多个公共类列在了一起,实际这样是不对的):
public class Person {
public void eat(){
System.out.println("人需要吃饭维持生命");
}
}
}
public class Parents extends Person{
public void eat(){
System.out.println("大人吃饭不会挑食");
}
}
public class Child extends Person {
public void eat(){
System.out.println("小孩子不好好吃饭,爱吃零食");
}
}
public class Dead extends Person {
}
public class Main {
public static void main(String[] args) {
Person person;
person=new Child();
person.eat();
person=new Parents();
person.eat();
person=new Dead();
person.eat();
}
}
执行结果:
小孩子不好好吃饭,爱吃零食
大人吃饭不会挑食
人需要吃饭维持生命
从上面的例子我们可以看到同样是person.eat()方法,却出现了不同的结果。这就是通过重写体现了Java的多态性。还可以看出因为Dead类没有重写eat方法,在运行时,输出的是Person的eat()结果,在我们运行之前我们是不知道结果的,只有运行完毕时才知道,所以重写体现的多态是运行时多态。