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本身。

这种思想叫做面向接口编程。

原文地址:https://www.cnblogs.com/Scorpicat/p/12022666.html