**多态**
多态的概念
多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
我们大家都遇到过这种情况一个父类的引用指向子类的对象
Father a = new Son()
这个时候如果a调用了一个父类和子类都有的方法时,那它会运行那个方法呢?这个时候只有真正运行它之后才能知道,我们来看以下的例子。
多态的实现
我们创建一个名为漫威的父类和一个名为钢铁侠的子类
class Marvel {
public void superpowers() {
System.out.println("每个漫威英雄都有超能力");
}
public void Creator() {
System.out.println("漫威的创造者是斯坦李");
}
}
class IronMan extends Marvel {
public void superpowers() {
System.out.println("钢铁侠有超级战甲");
}
public void rich() {
System.out.println("钢铁侠非常的有钱");
}
}
我们创建一个漫威父类的引用指向钢铁侠的子类对象并调用他们的superpowers()方法
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Marvel test = new IronMan();
test.superpowers();
}
}
输出的结果为
钢铁侠有超级战甲
并且我们还可以调用漫威父类独有的creator()方法
test.creator();
此时输出结果为
漫威的创造者是斯坦李
当我们试图调用子类独有的rich()方法时,编译器会报错提示我们rich()方法未定义
test.rich()
多态的总结
由上我们可以得出,当我们定义一个指向子类对象的父类引用时这个引用会向上转型。它可以访问父类中存在的属性和方法,而无法访问子类中独有的方法。当它去调用一个子类重写父类的方法时,这个时候调用的会是子类的方法。
多态的两种实现方式
多态的实现方式有两种,一是基于继承的,二是基于接口的。
1.基于继承的实现方式
基于继承的实现主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为
2基于接口的实现方式
继承由重写父类的同一方法的不同子类来实现多态,接口则通过实现接口覆盖同一方法的不同类来实现多态。但是接口的多态中,指向接口的引用必须是指实现了该接口的一个类的实例对象。因为接口并不能实例化,在执行时则根据该引用的对象类型来进行调用。
实现多态的条件
1.继承:在多态中必定存在有继承关系的父类和子类(或者实现了某个接口的类)
2.重写:子类需要对父类中的方法重写
3.向上转型:指向子类对象的父类引用Father test =new Son()
多态的优缺点
优点
1.提高了代码的扩展性
2.提高了代码的维护性
缺点
1.无法使用子类独有的属性的方法