50 多态,为什么总是要用父类引用指向子类对象?
多态三要素:
1.继承 2.重写父类方法 3.父类引用指向子类对象
代码:
package _20191211; /** * 多态 * @author TEDU * */ public class PolymorphicTest { /** *多态三要素: *1.继承 *2.重写父类方法 *3.父类引用指向子类对象 */ public static void main(String[] args) { Animal animal = new Animal(); animal.shout();//没有多态 Animal dog = new Dog();//3. 父类引用指向子类对象 dog.shout();//父类引用调用重写的方法,多态发生 //换个Cat试试 Animal cat = new Cat(); cat.shout(); } } class Animal{ public void shout() { System.out.println("叫~"); } } class Dog extends Animal{//1.继承 @Override public void shout() {// 2.重写父类方法 System.out.println("汪汪汪~"); } } class Cat extends Animal{ @Override public void shout() { System.out.println("喵喵喵~"); } }
结果:
叫~ 汪汪汪~ 喵喵喵~
为什么总是要用父类引用指向子类对象?
我们经常看到:List<String> list = new ArrayList<>();
那么为什么总是这么写呢?为什么不用ArrayList<String> list = new ArrayList<>();呢?
因为List接口下面除了ArrayList,还有Vector及其它子类,通常情况下,List下的方法及属性已经能满足需要了。如果使用后面这种方法,当我们需要将ArrayList改为Vector时,需要改动的地方就太多了。
比如:
//返回一个List
public List getList(){
ArraList list = new ArrayList();
}
后期我们需要改数据结构,改成Vector,那么只需将方法体中的代码改为
Vector v = new Vector();
return v;
即可,无需修改整个方法,尤其当返回的list引用被大量使用时,只需要改返回该list引用的方法中的内容就可以,不需要改list本身。
这种思想叫做面向接口编程。